182 lines
4.9 KiB
Lua
182 lines
4.9 KiB
Lua
local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
|
local DB = E:GetModule('DataBars')
|
|
local LSM = E.Libs.LSM
|
|
|
|
local _G = _G
|
|
local unpack, select = unpack, select
|
|
local pairs, ipairs = pairs, ipairs
|
|
local CreateFrame = CreateFrame
|
|
local GetInstanceInfo = GetInstanceInfo
|
|
local UnitAffectingCombat = UnitAffectingCombat
|
|
local C_PvP_IsWarModeActive = C_PvP.IsWarModeActive
|
|
|
|
function DB:OnLeave()
|
|
if self.db.mouseover then
|
|
E:UIFrameFadeOut(self, 1, self:GetAlpha(), 0)
|
|
end
|
|
|
|
if not _G.GameTooltip:IsForbidden() then
|
|
_G.GameTooltip:Hide()
|
|
end
|
|
end
|
|
|
|
function DB:CreateBar(name, key, updateFunc, onEnter, onClick, points)
|
|
local holder = CreateFrame('Frame', name..'Holder', E.UIParent, 'BackdropTemplate')
|
|
holder:SetTemplate(DB.db.transparent and 'Transparent')
|
|
holder:SetScript('OnEnter', onEnter)
|
|
holder:SetScript('OnLeave', DB.OnLeave)
|
|
holder:SetScript('OnMouseDown', onClick)
|
|
|
|
if points then
|
|
holder:ClearAllPoints()
|
|
holder:Point(unpack(points))
|
|
end
|
|
|
|
local bar = CreateFrame('StatusBar', name, holder)
|
|
bar:SetStatusBarTexture(E.media.normTex)
|
|
bar:EnableMouse(false)
|
|
bar:SetInside()
|
|
bar:Hide()
|
|
|
|
bar.barTexture = bar:GetStatusBarTexture()
|
|
bar.text = bar:CreateFontString(nil, 'OVERLAY', nil, 7)
|
|
bar.text:FontTemplate()
|
|
bar.text:Point('CENTER')
|
|
|
|
bar.holder = holder
|
|
bar.Update = updateFunc
|
|
|
|
E.FrameLocks[holder] = true
|
|
DB.StatusBars[key] = bar
|
|
|
|
return bar
|
|
end
|
|
|
|
function DB:CreateBarBubbles(bar)
|
|
if bar.bubbles then return end
|
|
|
|
bar.bubbles = {}
|
|
|
|
for i = 1, 19 do
|
|
bar.bubbles[i] = bar:CreateTexture(nil, 'OVERLAY', nil, 0)
|
|
bar.bubbles[i]:SetColorTexture(0, 0, 0)
|
|
end
|
|
end
|
|
|
|
function DB:UpdateBarBubbles(bar)
|
|
if not bar.bubbles then return end
|
|
|
|
local width, height = bar.db.width, bar.db.height
|
|
local vertical = bar:GetOrientation() ~= 'HORIZONTAL'
|
|
local bubbleWidth, bubbleHeight = vertical and (width - 2) or 1, vertical and 1 or (height - 2)
|
|
local offset = (vertical and height or width) / 20
|
|
|
|
for i, bubble in ipairs(bar.bubbles) do
|
|
bubble:ClearAllPoints()
|
|
bubble:SetSize(bubbleWidth, bubbleHeight)
|
|
bubble:SetShown(bar.db.showBubbles)
|
|
|
|
if vertical then
|
|
bubble:Point('TOP', bar, 'BOTTOM', 0, offset * i)
|
|
else
|
|
bubble:Point('RIGHT', bar, 'LEFT', offset * i, 0)
|
|
end
|
|
end
|
|
end
|
|
|
|
function DB:UpdateAll()
|
|
local texture = DB.db.customTexture and LSM:Fetch('statusbar', DB.db.statusbar) or E.media.normTex
|
|
|
|
for _, bar in pairs(DB.StatusBars) do
|
|
bar.holder.db = bar.db
|
|
bar.holder:Size(bar.db.width, bar.db.height)
|
|
bar.holder:SetTemplate(DB.db.transparent and 'Transparent')
|
|
bar.holder:EnableMouse(not bar.db.clickThrough)
|
|
bar.text:FontTemplate(LSM:Fetch('font', bar.db.font), bar.db.fontSize, bar.db.fontOutline)
|
|
bar:SetStatusBarTexture(texture)
|
|
bar:SetReverseFill(bar.db.reverseFill)
|
|
|
|
if bar.db.enable then
|
|
bar.holder:SetAlpha(bar.db.mouseover and 0 or 1)
|
|
end
|
|
|
|
if bar.db.hideInVehicle then
|
|
E:RegisterObjectForVehicleLock(bar.holder, E.UIParent)
|
|
else
|
|
E:UnregisterObjectForVehicleLock(bar.holder)
|
|
end
|
|
|
|
if bar.db.orientation == 'AUTOMATIC' then
|
|
bar:SetOrientation(bar.db.height > bar.db.width and 'VERTICAL' or 'HORIZONTAL')
|
|
bar:SetRotatesTexture(bar.db.height > bar.db.width)
|
|
else
|
|
bar:SetOrientation(bar.db.orientation)
|
|
bar:SetRotatesTexture(bar.db.orientation ~= 'HORIZONTAL')
|
|
end
|
|
|
|
local orientation = bar:GetOrientation()
|
|
local rotatesTexture = bar:GetRotatesTexture()
|
|
local reverseFill = bar:GetReverseFill()
|
|
|
|
for i = 1, bar.holder:GetNumChildren() do
|
|
local child = select(i, bar.holder:GetChildren())
|
|
if child:IsObjectType('StatusBar') then
|
|
child:SetStatusBarTexture(texture)
|
|
child:SetOrientation(orientation)
|
|
child:SetRotatesTexture(rotatesTexture)
|
|
child:SetReverseFill(reverseFill)
|
|
end
|
|
end
|
|
|
|
DB:UpdateBarBubbles(bar)
|
|
end
|
|
|
|
DB:HandleVisibility()
|
|
end
|
|
|
|
function DB:SetVisibility(bar)
|
|
if bar.showBar ~= nil then
|
|
bar:SetShown(bar.showBar)
|
|
bar.holder:SetShown(bar.showBar)
|
|
elseif bar.db.enable then
|
|
local hideBar = (bar == DB.StatusBars.Threat or bar.db.hideInCombat) and UnitAffectingCombat('player')
|
|
or (bar.db.hideOutsidePvP and not (C_PvP_IsWarModeActive() or select(2, GetInstanceInfo()) == 'pvp'))
|
|
or (bar.ShouldHide and bar:ShouldHide())
|
|
|
|
bar:SetShown(not hideBar)
|
|
bar.holder:SetShown(not hideBar)
|
|
else
|
|
bar:SetShown(false)
|
|
bar.holder:SetShown(false)
|
|
end
|
|
end
|
|
|
|
function DB:HandleVisibility()
|
|
for _, bar in pairs(DB.StatusBars) do
|
|
DB:SetVisibility(bar)
|
|
end
|
|
end
|
|
|
|
function DB:Initialize()
|
|
DB.Initialized = true
|
|
DB.StatusBars = {}
|
|
|
|
DB.db = E.db.databars
|
|
|
|
DB:ExperienceBar()
|
|
DB:ReputationBar()
|
|
DB:HonorBar()
|
|
DB:AzeriteBar()
|
|
DB:ThreatBar()
|
|
|
|
DB:UpdateAll()
|
|
|
|
DB:RegisterEvent('PLAYER_LEVEL_UP', 'HandleVisibility')
|
|
DB:RegisterEvent('PLAYER_ENTERING_WORLD', 'HandleVisibility')
|
|
DB:RegisterEvent('PLAYER_REGEN_DISABLED', 'HandleVisibility')
|
|
DB:RegisterEvent('PLAYER_REGEN_ENABLED', 'HandleVisibility')
|
|
DB:RegisterEvent('PVP_TIMER_UPDATE', 'HandleVisibility')
|
|
end
|
|
|
|
E:RegisterModule(DB:GetName())
|