ESOUI SVN TaosGroupTools

[/] [trunk/] [TaosGroupTools/] [ui/] [grouppurge/] [PurgeTracker.lua] - Rev 136

Compare with Previous | Blame | View Log

--[[
        Addon: Taos Group Tools
        Author: TProg Taonnor
        Created by @Taonnor
]]--

--[[
        Local variables
]]--
local _logger = nil
local _settingsHandler = TGT_SettingsHandler

local _isActive = false
local _isCreated = false
local _control = TGT_PurgeTrackerControl

--[[
        Table TGT_PurgeTracker
]]--
TGT_PurgeTracker = {}
TGT_PurgeTracker.__index = TGT_PurgeTracker

--[[
        ===============
    PRIVATE METHODS
    ===============
]]--

--[[
        Compare
]]--
local function Compare(trackerLeft, trackerRight)
    return trackerLeft.PurgeTimeStamp > trackerRight.PurgeTimeStamp
end

--[[
        SortTrackers
]]--
local function SortTrackers()
    -- Sort by longest first
    table.sort(_control.Trackers, Compare)

    local trackerContainer = _control:GetNamedChild("Container")
    local lastTracker = nil

    for i, tracker in ipairs(_control.Trackers) do
        -- Set hidden state
        if (tracker.Player and tracker.PurgeTimeStamp >= 0) then
            -- Set anchor
            tracker:ClearAnchors()
        
            if (i == 1) then
                tracker:SetAnchor(TOPLEFT, trackerContainer, TOPLEFT, 0, 3)
            else
                        tracker:SetAnchor(TOPLEFT, lastTracker, BOTTOMLEFT, 0, 3)
                end

            lastTracker = tracker
            tracker:SetHidden(false)
        else
            tracker:ClearAnchors()
            tracker:SetHidden(true)
        end
    end

    return lastTracker
end

--[[
        GetPlayerTracker
]]--
local function GetPlayerTracker(player)
    -- search player
    for i, tracker in ipairs(_control.Trackers) do
        if (tracker.Player ~= nil and tracker.Player.PlayerName == player.PlayerName) then
            return tracker
        end
    end

    -- search free
    for i, tracker in ipairs(_control.Trackers) do
        if (tracker.Player == nil) then
            return tracker
        end
    end

    return nil
end

--[[
        SetupTracker
]]--
local function SetupTracker(player, tracker)
    tracker.PurgeTimeStamp = GetGameTimeMilliseconds()
    tracker.Player = player

    local playerName = player.PlayerName
    if (_settingsHandler.SavedVariables.AccountNames) then
        playerName = GetUnitDisplayName(player.PingTag)
    end

    tracker.TimeLabel:SetText(zo_strformat("<<1>>", playerName))
end

--[[
        UpdatePlayerPurgable
]]--
local function UpdatePlayerPurgable(player)
    if (player) then
        local tracker = GetPlayerTracker(player)

        if (tracker) then
            if (player.IsPurgable) then
                SetupTracker(player, tracker)
            else
                tracker:SetHidden(true)
                tracker.PurgeTimeStamp = -1
                tracker.Player = nil
            end

            SortTrackers()
        else
            _logger:logError("TGT_PurgeTracker -> UpdatePlayerPurgable; No tracker")
        end
    end
end

--[[
        UpdatePurgeFrameHeader sets Purge frame header hidden
]]--
local function UpdatePurgeFrameHeader()
    local isHidden = _settingsHandler.SavedVariables.IsGroupPurgeHeaderVisible == false
    _control:GetNamedChild("HeaderLabel"):SetHidden(isHidden)
end

--[[
        SetControlColor sets control color
]]--
local function SetControlColors(part)
    if (part == GROUP_PURGE) then
        local controlColor = _settingsHandler.SavedVariables.ModuleColors[part].GroupPurgeColor
        local labelColor = GetAdjustedLabelColor(controlColor)
            
        for i, tracker in ipairs(_control.Trackers) do
            tracker.Background:SetAlpha(1)
            tracker.Background:SetCenterColor(controlColor.R, controlColor.G, controlColor.B, controlColor.A)
            tracker.TimeLabel:SetColor(labelColor.R, labelColor.G, labelColor.B, labelColor.A)
        end
    end
end

--[[
        ResizeControl resizes container control
]]--
local function ResizeControl()
    local size = _settingsHandler.SavedVariables.GroupPurgeSize
    local height = GROUP_SIZE_MAX * size.Height + _control:GetNamedChild("HeaderLabel"):GetHeight()

    _control:SetDimensions(size.Width, height)
end

--[[
        ResizePurgeBars resizes Purge bars
]]--
local function ResizePurgeBars()
    local size = _settingsHandler.SavedVariables.GroupPurgeSize

    for i, tracker in ipairs(_control.Trackers) do
        tracker:SetDimensions(size.Width, size.Height)
        tracker.TimeLabel:SetDimensions(size.Width - 10, size.Height - 2)
    end

    SortTrackers() -- Resets anchors
    ResizeControl()
end

--[[
        RestorePosition sets settings position
]]--
local function RestorePosition()
    local posX = _settingsHandler.SavedVariables.Position[GROUP_PURGE].PosX
    local posY = _settingsHandler.SavedVariables.Position[GROUP_PURGE].PosY

    _control:ClearAnchors()
    _control:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, posX, posY)
end

--[[
        SetControlMovable sets the Movable and MouseEnabled flag in UI elements
]]--
local function SetControlMovable()
    local isMovable = _settingsHandler.SavedVariables.Movable

    _control:GetNamedChild("MovableControl"):SetHidden(isMovable == false)

    _control:SetMovable(isMovable)
        _control:SetMouseEnabled(isMovable)
end

--[[
        SetControlHidden sets hidden on control
]]--
local function SetControlHidden()
    -- Get isActive from settings
    if (_settingsHandler.SavedVariables.IsGroupPurgeEnabled and _isCreated) then
        if (GetIsUnitGrouped()) then
                        _control:SetHidden(CurrentHudHiddenState())
        else
            _control:SetHidden(true)
        end
    else
        _control:SetHidden(true)
    end
end

--[[
        CreateTrackers creates tracker sub controls
]]--
local function CreateTrackers()
    local trackerContainer = _control:GetNamedChild("Container")
    _control.Trackers = {}
    local lastTracker = nil

    for i=1, GROUP_SIZE_MAX, 1 do
        local tracker = CreateControlFromVirtual("$(parent)PurgeTracker", trackerContainer, "TimedBuffTrackerControl", i)
        tracker:GetNamedChild("StatusBar"):SetHidden(true)
        tracker.Background = tracker:GetNamedChild("Background")
        tracker.TimeLabel = tracker:GetNamedChild("TimeLabel")
        tracker.PurgeTimeStamp = -1

        tracker:ClearAnchors()
        tracker:SetHidden(true)

        lastTracker = tracker
        _control.Trackers[i] = tracker
    end
end

--[[
        SetControlActive sets hidden on control
]]--
local function SetControlActive()
    SetControlHidden()

    -- Get isActive from settings
    local isActive = _settingsHandler.SavedVariables.IsGroupPurgeEnabled

    if (_isActive ~= isActive) then
        _isActive = isActive

        if (isActive) then
            -- Workaround: To avoid "Too many anchors processed" error; Thank you ZOS for stealing hours of my life!
            if (_isCreated == false) then
                _isCreated = true
                CreateTrackers()
            end

            SetControlMovable()
            RestorePosition()
            UpdatePurgeFrameHeader()
            SetControlColors(GROUP_PURGE)
            ResizePurgeBars()
            
            CALLBACK_MANAGER:RegisterCallback(TAO_HUD_HIDDEN_STATE_CHANGED, SetControlHidden)
            CALLBACK_MANAGER:RegisterCallback(TAO_UNIT_GROUPED_CHANGED, SetControlHidden)
            CALLBACK_MANAGER:RegisterCallback(TGT_MOVABLE_CHANGED, SetControlMovable)
            CALLBACK_MANAGER:RegisterCallback(TGT_PLAYER_DATA_PURGE_CHANGED, UpdatePlayerPurgable)
            CALLBACK_MANAGER:RegisterCallback(TGT_GROUP_PURGE_HEADER_CHANGED, UpdatePurgeFrameHeader)
            CALLBACK_MANAGER:RegisterCallback(TGT_COLOR_SETTINGS_CHANGED, SetControlColors)
            CALLBACK_MANAGER:RegisterCallback(TGT_GROUP_PURGE_SIZE_CHANGED, ResizePurgeBars)
        else
            CALLBACK_MANAGER:UnregisterCallback(TAO_HUD_HIDDEN_STATE_CHANGED, SetControlHidden)
            CALLBACK_MANAGER:UnregisterCallback(TAO_UNIT_GROUPED_CHANGED, SetControlHidden)
            CALLBACK_MANAGER:UnregisterCallback(TGT_MOVABLE_CHANGED, SetControlMovable)
            CALLBACK_MANAGER:UnregisterCallback(TGT_PLAYER_DATA_PURGE_CHANGED, UpdatePlayerPurgable)
            CALLBACK_MANAGER:UnregisterCallback(TGT_GROUP_PURGE_HEADER_CHANGED, UpdatePurgeFrameHeader)
            CALLBACK_MANAGER:UnregisterCallback(TGT_COLOR_SETTINGS_CHANGED, SetControlColors)
            CALLBACK_MANAGER:UnregisterCallback(TGT_GROUP_PURGE_SIZE_CHANGED, ResizePurgeBars)
        end
    end
end

--[[
        ==============
    PUBLIC METHODS
    ==============
]]--

--[[
        TGT_PurgeTracker_OnMoveStop saves position
]]--
function TGT_PurgeTracker_OnMoveStop(control)
    _settingsHandler.SavedVariables.Position[GROUP_PURGE].PosX = control:GetLeft()
    _settingsHandler.SavedVariables.Position[GROUP_PURGE].PosY = control:GetTop()
end

--[[
        Initialize initializes TGT_PurgeTracker
]]--
function TGT_PurgeTracker.Initialize()
    _logger = TGT_LOGGER

    CALLBACK_MANAGER:RegisterCallback(TGT_IS_ZONE_CHANGED, SetControlActive)
    CALLBACK_MANAGER:RegisterCallback(TGT_PLAYER_ACTIVATED, SetControlActive)
    CALLBACK_MANAGER:RegisterCallback(TAO_UNIT_GROUPED_CHANGED, SetControlActive)
    CALLBACK_MANAGER:RegisterCallback(TGT_GROUP_PURGE_ENABLED_CHANGED, SetControlActive)
    
    _logger:logTrace("TGT_PurgeTracker -> Initialized")
end

Compare with Previous | Blame