ESOUI SVN TaosGroupTools

[/] [trunk/] [TaosGroupTools/] [ui/] [groupultimate/] [SimpleList.lua] - Rev 116

Compare with Previous | Blame | View Log

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

--[[
        Local variables
]]--
local TIMEOUT = PLAYERTIMEOUT

local _logger = nil
local _settingsHandler = TGT_SettingsHandler
local _playerHandler = TGT_PlayerHandler

local _name = "TGT-SimpleList"
local _control = TGT_SimpleListControl
local _controlTable = TGT_SimpleListControlContainer
local _isActive = false
local _isCreated = false
local _players = {}

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

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

--[[
        Updates list row
]]--
local function UpdateListRow(row, player)
    local localizedUltimateName = zo_strformat(SI_ABILITY_TOOLTIP_NAME, player.UltimateName)
    local playerName = player.PlayerName
    if (_settingsHandler.SavedVariables.AccountNames) then
        playerName = GetUnitDisplayName(player.PingTag)
    end

    if (_settingsHandler.SavedVariables.CombatActive[GROUP_ULTIMATE] and player.IsPlayerInCombat) then
        playerName = playerName .. "*"
    end

    local resourcesString = player.RelativeUltimate

    if (_settingsHandler.SavedVariables.IsGroupResourcesEnabled) then
        resourcesString = zo_strformat("<<1>>/<<2>>/<<3>>", player.RelativeUltimate, player.RelativeStamina, player.RelativeMagicka)
    end

    row:GetNamedChild("SenderNameValueLabel"):SetText(playerName)
        row:GetNamedChild("UltimateValueLabel"):SetText(localizedUltimateName)
        row:GetNamedChild("ReadyValueLabel"):SetText(resourcesString)

    if (player.IsPlayerTimedOut or player.IsPlayerOnline == false) then
                row:GetNamedChild("SenderNameValueLabel"):SetColor(0.3, 0.3, 0.3, 1)
                row:GetNamedChild("UltimateValueLabel"):SetColor(0.3, 0.3, 0.3, 1)
                row:GetNamedChild("ReadyValueLabel"):SetColor(0.3, 0.3, 0.3, 1)
        elseif (player.IsPlayerDead) then
        row:GetNamedChild("SenderNameValueLabel"):SetColor(1.0, 0.0, 0.0, 1)
                row:GetNamedChild("UltimateValueLabel"):SetColor(1.0, 0.0, 0.0, 1)
                row:GetNamedChild("ReadyValueLabel"):SetColor(1.0, 0.0, 0.0, 1)
    elseif (player.RelativeUltimate == 100) then
                row:GetNamedChild("SenderNameValueLabel"):SetColor(0.0, 1.0, 0.0, 1)
                row:GetNamedChild("UltimateValueLabel"):SetColor(0.0, 1.0, 0.0, 1)
                row:GetNamedChild("ReadyValueLabel"):SetColor(0.0, 1.0, 0.0, 1)
        else
                row:GetNamedChild("SenderNameValueLabel"):SetColor(1.0, 1.0, 1.0, 1)
                row:GetNamedChild("UltimateValueLabel"):SetColor(1.0, 1.0, 1.0, 1)
                row:GetNamedChild("ReadyValueLabel"):SetColor(1.0, 1.0, 1.0, 1)
        end

    if (row:IsHidden()) then
                row:SetHidden(false)
        end
end

--[[
        Compare
]]--
local function Compare(playerLeft, playerRight)
    if (playerLeft.RelativeUltimate == playerRight.RelativeUltimate) then
        return playerLeft.PlayerPosition < playerRight.PlayerPosition
    else
        return playerLeft.RelativeUltimate > playerRight.RelativeUltimate
    end
end

--[[
        Sets visibility of labels
]]--
local function RefreshList()
    local functionTimestamp = GetGameTimeMilliseconds()

    local players = {}
    local nextFreeRow = 1
    
    for i,player in pairs(_playerHandler.GetRemoteGroupPlayers()) do
        if (player.UltimateGroup ~= nil) then
            players[nextFreeRow] = player
            nextFreeRow = nextFreeRow + 1
        end
    end
    
    if (_settingsHandler.SavedVariables.IsSortingActive) then
            table.sort(players, Compare)
    end

    local lastRow = nil

    for i=1, GROUP_SIZE_MAX, 1 do
        local row = _controlTable:GetNamedChild("Row" .. i)
        local listPlayer = players[i]

        if (listPlayer ~= nil) then
                    row:ClearAnchors()

                    if i == 1 then
                row:SetAnchor(TOPLEFT, _controlTable, TOPLEFT, 0, 0)
                row:SetAnchor(TOPRIGHT, _controlTable, TOPRIGHT, 0, 0)
            else
                row:SetAnchor(TOPLEFT, lastRow, BOTTOMLEFT, 0, 0)
                row:SetAnchor(TOPRIGHT, lastRow, BOTTOMRIGHT, 0, 0)
            end
                
                    lastRow = row

            listPlayer.UltimateSimpleListRow = row
            UpdateListRow(row, listPlayer)
        else
                    row:ClearAnchors()
            row:SetHidden(true)
        end
    end
        
    _logger:logTrace("TGT_SimpleList -> RefreshList", GetGameTimeMilliseconds() - functionTimestamp)
end

--[[
        Updates players
]]--
local function UpdatePlayer(player)
        if (player) then
        if (player.UltimateSimpleListRow ~= nil) then
            UpdateListRow(player.UltimateSimpleListRow, player)
        end
    end
end

--[[
        Clears player
]]--
local function ClearPlayer(player)
        if (player) then
        player.UltimateSimpleListRow = nil
    end
end

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

    _control:GetNamedChild("MovableControl"):SetHidden(isMovable == false)
    _control:SetMovable(isMovable)
        _control:SetMouseEnabled(isMovable)
end

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

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

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

--[[
        SetGroupResources shows/hide the GroupResources UI elements
]]--
local function SetGroupResources()
    if (_settingsHandler.SavedVariables.IsGroupResourcesEnabled) then
        _control:GetNamedChild("ReadyHeaderLabel"):SetText("Ult/Stam/Mag")
    else
        _control:GetNamedChild("ReadyHeaderLabel"):SetText("Ultimate")
    end
end

--[[
        CreateSimpleListRows creates simple list rows
]]--
local function CreateSimpleListRows()
        for i=1, GROUP_SIZE_MAX, 1 do
                local row = CreateControlFromVirtual("$(parent)Row", _controlTable, "GroupUltimateSimpleListRow", i)

                row:SetHidden(true) -- initial not visible
        end
end

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

    -- Get isActive from settings
    local isActive = _settingsHandler.IsSimpleListVisible()

    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
                CreateSimpleListRows()
            end

            SetControlMovable()
            RestorePosition()
            SetGroupResources()
            RefreshList()
            
            CALLBACK_MANAGER:RegisterCallback(TGT_PLAYER_DATA_REFRESH, RefreshList)
            CALLBACK_MANAGER:RegisterCallback(TGT_PLAYER_DATA_REMOTE_CHANGED, UpdatePlayer)
            CALLBACK_MANAGER:RegisterCallback(TGT_PLAYER_DATA_CLEAR, ClearPlayer)
            CALLBACK_MANAGER:RegisterCallback(TGT_MOVABLE_CHANGED, SetControlMovable)
            CALLBACK_MANAGER:RegisterCallback(TAO_HUD_HIDDEN_STATE_CHANGED, SetControlHidden)
            CALLBACK_MANAGER:RegisterCallback(TGT_VISIBLE_OFFSET_CHANGED, SetControlHidden)
            CALLBACK_MANAGER:RegisterCallback(TGT_GROUP_RESOURCES_ENABLED_CHANGED, SetGroupResources)
        else
            CALLBACK_MANAGER:UnregisterCallback(TGT_PLAYER_DATA_REFRESH, RefreshList)
            CALLBACK_MANAGER:UnregisterCallback(TGT_PLAYER_DATA_REMOTE_CHANGED, UpdatePlayer)
            CALLBACK_MANAGER:UnregisterCallback(TGT_PLAYER_DATA_CLEAR, ClearPlayer)
            CALLBACK_MANAGER:UnregisterCallback(TGT_MOVABLE_CHANGED, SetControlMovable)
            CALLBACK_MANAGER:UnregisterCallback(TAO_HUD_HIDDEN_STATE_CHANGED, SetControlHidden)
            CALLBACK_MANAGER:UnregisterCallback(TGT_VISIBLE_OFFSET_CHANGED, SetControlHidden)
            CALLBACK_MANAGER:UnregisterCallback(TGT_GROUP_RESOURCES_ENABLED_CHANGED, SetGroupResources)
        end
    end
end

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

--[[
        OnSimpleListMoveStop saves current TGT_SimpleList position to settings
]]--
function TGT_SimpleList.OnSimpleListMoveStop()
        local left = _control:GetLeft()
        local top = _control:GetTop()
        
    _settingsHandler.SavedVariables.Position[GROUP_ULTIMATE].PosX = left
    _settingsHandler.SavedVariables.Position[GROUP_ULTIMATE].PosY = top
end

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

    CALLBACK_MANAGER:RegisterCallback(TGT_STYLE_CHANGED, SetControlActive)
    CALLBACK_MANAGER:RegisterCallback(TGT_SENDING_CHANGED, SetControlActive)
    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_ULTIMATE_ENABLED_CHANGED, SetControlActive)

    _logger:logTrace("TGT_SimpleList -> Initialized")
end

Compare with Previous | Blame