ESOUI SVN TaosGroupTools

[/] [trunk/] [TaosGroupTools/] [ui/] [groupearthgore/] [EarthgoreTracker.lua] - Rev 136

Compare with Previous | Blame | View Log

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

--[[
        Local variables
]]--
local EARTHGORE = EARTHGORE_ICON_ID

local _logger = nil
local _settingsHandler = TGT_SettingsHandler

local _isActive = false
local _isCreated = false
local _control = TGT_EarthgoreTrackerControl

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

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

--[[
        SortTrackers
]]--
local function SortTrackers()
    local trackerContainer = _control:GetNamedChild("Container")
    local lastTracker = nil

    for i, tracker in ipairs(_control.Trackers) do
        -- Set hidden state
        if (tracker.Player and tracker.EarthgoreTimeStamp >= 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.EarthgoreTimeStamp = 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

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

        if (tracker) then
            if (player.Buffs[EARTHGORE] ~= nil and player.Buffs[EARTHGORE].isActive) then
                SetupTracker(player, tracker)
            else
                tracker:SetHidden(true)
                tracker.EarthgoreTimeStamp = -1
                tracker.Player = nil
            end

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

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

--[[
        SetControlColor sets control color
]]--
local function SetControlColors(part)
    if (part == GROUP_EARTHGORE) then
        local controlColor = _settingsHandler.SavedVariables.ModuleColors[part].GroupEarthgoreColor
        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.GroupEarthgoreSize
    local height = GROUP_SIZE_MAX * size.Height + _control:GetNamedChild("HeaderLabel"):GetHeight()

    _control:SetDimensions(size.Width, height)
end

--[[
        ResizeEarthgoreBars resizes Earthgore bars
]]--
local function ResizeEarthgoreBars()
    local size = _settingsHandler.SavedVariables.GroupEarthgoreSize

    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_EARTHGORE].PosX
    local posY = _settingsHandler.SavedVariables.Position[GROUP_EARTHGORE].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.IsGroupEarthgoreEnabled 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)EarthgoreTracker", trackerContainer, "TimedBuffTrackerControl", i)
        tracker:GetNamedChild("StatusBar"):SetHidden(true)
        tracker.Background = tracker:GetNamedChild("Background")
        tracker.TimeLabel = tracker:GetNamedChild("TimeLabel")
        tracker.EarthgoreTimeStamp = -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.IsGroupEarthgoreEnabled

    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()
            UpdateEarthgoreFrameHeader()
            SetControlColors(GROUP_EARTHGORE)
            ResizeEarthgoreBars()
            
            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_REMOTE_CHANGED, UpdatePlayerEarthgore)
            CALLBACK_MANAGER:RegisterCallback(TGT_GROUP_EARTHGORE_HEADER_CHANGED, UpdateEarthgoreFrameHeader)
            CALLBACK_MANAGER:RegisterCallback(TGT_COLOR_SETTINGS_CHANGED, SetControlColors)
            CALLBACK_MANAGER:RegisterCallback(TGT_GROUP_EARTHGORE_SIZE_CHANGED, ResizeEarthgoreBars)
        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_REMOTE_CHANGED, UpdatePlayerEarthgore)
            CALLBACK_MANAGER:UnregisterCallback(TGT_GROUP_EARTHGORE_HEADER_CHANGED, UpdateEarthgoreFrameHeader)
            CALLBACK_MANAGER:UnregisterCallback(TGT_COLOR_SETTINGS_CHANGED, SetControlColors)
            CALLBACK_MANAGER:UnregisterCallback(TGT_GROUP_EARTHGORE_SIZE_CHANGED, ResizeEarthgoreBars)
        end
    end
end

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

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

--[[
        Initialize initializes TGT_EarthgoreTracker
]]--
function TGT_EarthgoreTracker.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_EARTHGORE_ENABLED_CHANGED, SetControlActive)
    
    _logger:logTrace("TGT_EarthgoreTracker -> Initialized")
end

Compare with Previous | Blame