133 lines
4.1 KiB
Lua
133 lines
4.1 KiB
Lua
local NanamiDPS = NanamiDPS
|
|
local DataStore = NanamiDPS.DataStore
|
|
local L = NanamiDPS.L
|
|
|
|
local BarDisplay = {}
|
|
NanamiDPS.BarDisplay = BarDisplay
|
|
|
|
local BAR_POOL = {}
|
|
|
|
function BarDisplay:CreateBar(parent, index)
|
|
local cfg = NanamiDPS.config or {}
|
|
local barHeight = cfg.barHeight or 16
|
|
local barSpacing = cfg.barSpacing or 1
|
|
local fontSize = cfg.fontSize or 10
|
|
local A = SFrames.ActiveTheme
|
|
|
|
local bar = CreateFrame("StatusBar", "NanamiDPSBar" .. parent:GetID() .. "_" .. index, parent)
|
|
bar:SetStatusBarTexture(SFrames:GetTexture())
|
|
bar:SetHeight(barHeight)
|
|
bar:SetMinMaxValues(0, 1)
|
|
bar:SetValue(0)
|
|
bar:SetFrameLevel(parent:GetFrameLevel() + 3)
|
|
|
|
bar.bg = bar:CreateTexture(nil, "BACKGROUND")
|
|
bar.bg:SetTexture(SFrames:GetTexture())
|
|
bar.bg:SetAllPoints(bar)
|
|
if A and A.barBg then
|
|
bar.bg:SetVertexColor(A.barBg[1], A.barBg[2], A.barBg[3], A.barBg[4] or 0.6)
|
|
else
|
|
bar.bg:SetVertexColor(0.15, 0.15, 0.15, 0.6)
|
|
end
|
|
|
|
if cfg.showClassIcons and SFrames.CreateClassIcon then
|
|
bar.classIcon = SFrames:CreateClassIcon(bar, barHeight - 2)
|
|
bar.classIcon.overlay:SetPoint("LEFT", bar, "LEFT", 2, 0)
|
|
end
|
|
|
|
local textOffset = (cfg.showClassIcons and barHeight + 2) or 4
|
|
|
|
bar.textLeft = SFrames:CreateFontString(bar, fontSize, "LEFT")
|
|
bar.textLeft:SetPoint("LEFT", bar, "LEFT", textOffset, 0)
|
|
bar.textLeft:SetPoint("RIGHT", bar, "RIGHT", -130, 0)
|
|
|
|
bar.textRight = SFrames:CreateFontString(bar, fontSize, "RIGHT")
|
|
bar.textRight:SetPoint("RIGHT", bar, "RIGHT", -4, 0)
|
|
bar.textRight:SetWidth(126)
|
|
|
|
bar:EnableMouse(true)
|
|
bar:SetScript("OnEnter", function()
|
|
if this.onEnter then this.onEnter(this) end
|
|
end)
|
|
bar:SetScript("OnLeave", function()
|
|
if this.onLeave then this.onLeave(this) end
|
|
end)
|
|
bar:SetScript("OnMouseUp", function()
|
|
if this.onClick then this.onClick(this, arg1) end
|
|
end)
|
|
|
|
bar.index = index
|
|
return bar
|
|
end
|
|
|
|
function BarDisplay:LayoutBars(window)
|
|
local cfg = NanamiDPS.config or {}
|
|
local barHeight = cfg.barHeight or 16
|
|
local barSpacing = cfg.barSpacing or 1
|
|
local headerHeight = 22
|
|
|
|
for i, bar in ipairs(window.bars) do
|
|
bar:ClearAllPoints()
|
|
bar:SetPoint("TOPLEFT", window.content, "TOPLEFT", 1, -((i - 1) * (barHeight + barSpacing)))
|
|
bar:SetPoint("TOPRIGHT", window.content, "TOPRIGHT", -1, -((i - 1) * (barHeight + barSpacing)))
|
|
bar:SetHeight(barHeight)
|
|
end
|
|
end
|
|
|
|
function BarDisplay:UpdateBar(bar, data, maxVal, rank)
|
|
if not data then
|
|
bar:Hide()
|
|
return
|
|
end
|
|
|
|
bar:Show()
|
|
bar:SetMinMaxValues(0, maxVal > 0 and maxVal or 1)
|
|
bar:SetValue(data.value or 0)
|
|
|
|
local r, g, b = data.r or 0.6, data.g or 0.6, data.b or 0.6
|
|
bar:SetStatusBarColor(r, g, b, 1)
|
|
bar.bg:SetVertexColor(r * 0.25, g * 0.25, b * 0.25, 0.6)
|
|
|
|
local nameStr = rank .. ". " .. (data.name or L["Unknown"])
|
|
bar.textLeft:SetText(nameStr)
|
|
|
|
local valStr
|
|
if data.valueText then
|
|
valStr = data.valueText
|
|
else
|
|
valStr = NanamiDPS.formatNumber(data.value or 0)
|
|
if data.percent then
|
|
valStr = valStr .. " (" .. NanamiDPS.round(data.percent, 1) .. "%)"
|
|
end
|
|
end
|
|
bar.textRight:SetText(valStr)
|
|
|
|
if bar.classIcon and data.class and NanamiDPS.validClasses[data.class] then
|
|
SFrames:SetClassIcon(bar.classIcon, data.class)
|
|
elseif bar.classIcon then
|
|
bar.classIcon:Hide()
|
|
if bar.classIcon.overlay then bar.classIcon.overlay:Hide() end
|
|
end
|
|
|
|
bar.barData = data
|
|
end
|
|
|
|
function BarDisplay:SetBarCallbacks(bar, onEnter, onLeave, onClick)
|
|
bar.onEnter = onEnter
|
|
bar.onLeave = onLeave
|
|
bar.onClick = onClick
|
|
end
|
|
|
|
function BarDisplay:GetMaxBars(window)
|
|
local cfg = NanamiDPS.config or {}
|
|
local barHeight = cfg.barHeight or 16
|
|
local barSpacing = cfg.barSpacing or 1
|
|
local contentHeight = 200
|
|
if window.content then
|
|
local h = window.content:GetHeight()
|
|
if h and h > 10 then contentHeight = h end
|
|
end
|
|
local maxBars = math.floor(contentHeight / (barHeight + barSpacing))
|
|
return math.max(maxBars, 1)
|
|
end
|