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