Files
coa-kui-nameplates/Kui_Nameplates/Libs/Kui/Kui.lua
T
2023-05-22 20:03:54 -07:00

330 lines
9.6 KiB
Lua

local MAJOR, MINOR = 'Kui-1.0', 13
local kui = LibStub:NewLibrary(MAJOR, MINOR)
if not kui then
-- already registered
return
end
--------------------------------------------------------------- media / files --
local media = "Interface\\AddOns\\Kui_Nameplates\\Media\\"
kui.m = {
t = {
-- borders
shadow = media .. 't\\shadowBorder',
rounded = media .. 't\\solidRoundedBorder',
-- textures
solid = media .. 't\\solid',
innerShade = media .. 't\\innerShade',
-- progress bars
bar = media .. 't\\bar',
oldbar = media .. 't\\bar-old',
sbar = media .. 't\\barSmall',
empty = media..'t\\empty',
},
f = {
yanone = media..'f\\yanone.ttf',
francois = media..'f\\francois.ttf',
},
}
------------------------------------------------------------------ var tables --
local ct = { -- classification table
elite = { '+', 'elite' },
rare = { 'r', 'rare' },
rareelite = { 'r+', 'rare elite' },
worldboss = { 'b', 'boss' }
}
------------------------------------------------------------------- functions --
kui.print = function(...)
local vals = {...}
local msg = ''
for k,v in ipairs(vals) do
msg = tostring(v)..', '
end
print(GetTime()..': '..msg:gsub(", $",""))
end
kui.GetClassColour = function(class, str)
if not class then
class = select(2, UnitClass('player'))
elseif not RAID_CLASS_COLORS[class] then
-- assume class is a unit
class = select(2, UnitClass(class))
end
if CUSTOM_CLASS_COLORS then
class = CUSTOM_CLASS_COLORS[class]
else
class = RAID_CLASS_COLORS[class]
end
if str then
return string.format("%02x%02x%02x", class.r*255, class.g*255, class.b*255)
else
return class
end
end
kui.UnitIsPet = function(unit)
return (not UnitIsPlayer(unit) and UnitPlayerControlled(unit))
end
kui.GetUnitColour = function(unit, str)
-- class colour for players or pets
-- faction colour for NPCs
local ret, r, g, b
if (UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit))
or UnitIsDeadOrGhost(unit)
or not UnitIsConnected(unit)
then
ret = { r = .5, g = .5, b = .5 }
else
if UnitIsPlayer(unit) or kui.UnitIsPet(unit) then
return kui.GetClassColour(unit, str)
else
r, g, b = UnitSelectionColor(unit)
ret = { r = r, g = g, b = b }
end
end
if str then
return string.format("%02x%02x%02x", ret.r*255, ret.g*255, ret.b*255)
else
return ret
end
end
kui.UnitLevel = function(unit, long)
local level, classification =
UnitLevel(unit), UnitClassification(unit)
local diff = GetQuestDifficultyColor(level <= 0 and 999 or level)
if ct[classification] then
classification = long and ct[classification][2] or ct[classification][1]
else
classification = ''
end
if level == -1 then
level = '??'
end
return level, classification, diff
end
kui.ModifyFontFlags = function(fs, io, flag)
local font, size, flags = fs:GetFont()
local flagStart,flagEnd = strfind(flags, flag)
if io and not flagStart then
-- add flag
flags = flags..' '..flag
elseif not io and flagStart then
-- remove flag
flags = strsub(flags, 0, flagStart-1) .. strsub(flags, flagEnd+1)
end
fs:SetFont(font, size, flags)
end
kui.CreateFontString = function(parent, args)
local ob, font, size, outline, alpha, shadow, mono
args = args or {}
if args.reset then
-- to change an already existing fontString
ob = parent
else
ob = parent:CreateFontString(nil, 'OVERLAY')
end
font = args.font or 'Fonts\\FRIZQT__.TTF'
size = args.size or 12
outline = args.outline or nil
mono = args.mono or args.monochrome or nil
alpha = args.alpha or 1
shadow = args.shadow or false
ob:SetFont(font, size, (outline and 'OUTLINE' or '')..(mono and ' MONOCHROME' or ''))
ob:SetAlpha(alpha)
if shadow then
ob:SetShadowColor(0, 0, 0, 1)
ob:SetShadowOffset(type(shadow) == 'table' and unpack(shadow) or 1, -1)
elseif not shadow and args.reset then
-- remove the shadow
ob:SetShadowColor(0, 0, 0, 0)
end
return ob
end
-- Format numbers
kui.num = function(num)
if num < 1000 then
return num
elseif num >= 1000000 then
return string.format('%.1fm', num/1000000)
elseif num >= 1000 then
return string.format('%.1fk', num/1000)
end
end
-- Format times (given in seconds)
kui.FormatTime = function(s)
if s > 86400 then
-- days
return ceil(s/86400) .. 'd', s%86400
elseif s >= 3600 then
-- hours
return ceil(s/3600) .. 'h', s%3600
elseif s >= 60 then
-- minutes
return ceil(s/60) .. 'm', s%60
elseif s <= 10 then
return ceil(s), s - format("%.1f", s)
end
return floor(s), s - floor(s)
end
-- Pluralise a word pertaining to a value
kui.Pluralise = function(word, value, with)
if value == 1 then
return word
else
return word .. (with and with or 's')
end
end
-- substr for utf8 characters (which are somtimes longer than 1 byte)
do
local function chsize(char)
if not char then
return 0
elseif char > 240 then
return 4
elseif char > 225 then
return 3
elseif char > 192 then
return 2
else
return 1
end
end
-- substr for utf8 characters (which are somtimes longer than 1 byte)
kui.utf8sub = function(str, startChar, numChars)
numChars = numChars or #str
local startIndex = 1
while startChar > 1 do
local char = string.byte(str, startIndex)
startIndex = startIndex + chsize(char)
startChar = startChar - 1
end
local currentIndex = startIndex
while numChars > 0 and currentIndex <= #str do
local char = string.byte(str, currentIndex)
currentIndex = currentIndex + chsize(char)
numChars = numChars - 1
end
return str:sub(startIndex, currentIndex - 1)
end
end
-- Frame fading functions
-- (without the taint of UIFrameFade & the lag of AnimationGroups)
kui.frameFadeFrame = CreateFrame('Frame')
kui.FADEFRAMES = {}
kui.frameIsFading = function(frame)
for index, value in pairs(kui.FADEFRAMES) do
if value == frame then
return true
end
end
end
kui.frameFadeRemoveFrame = function(frame)
tDeleteItem(kui.FADEFRAMES, frame)
end
kui.frameFadeOnUpdate = function(self, elapsed)
local frame, info
for index, value in pairs(kui.FADEFRAMES) do
frame, info = value, value.fadeInfo
if info.startDelay and info.startDelay > 0 then
info.startDelay = info.startDelay - elapsed
else
info.fadeTimer = (info.fadeTimer and info.fadeTimer + elapsed) or 0
if info.fadeTimer < info.timeToFade then
-- perform animation in either direction
if info.mode == 'IN' then
frame:SetAlpha(
(info.fadeTimer / info.timeToFade) *
(info.endAlpha - info.startAlpha) +
info.startAlpha
)
elseif info.mode == 'OUT' then
frame:SetAlpha(
((info.timeToFade - info.fadeTimer) / info.timeToFade) *
(info.startAlpha - info.endAlpha) + info.endAlpha
)
end
else
-- animation has ended
frame:SetAlpha(info.endAlpha)
if info.fadeHoldTime and info.fadeHoldTime > 0 then
info.fadeHoldTime = info.fadeHoldTime - elapsed
else
kui.frameFadeRemoveFrame(frame)
if info.finishedFunc then
info.finishedFunc(frame)
info.finishedFunc = nil
end
end
end
end
end
if #kui.FADEFRAMES == 0 then
self:SetScript('OnUpdate', nil)
end
end
--[[
info = {
mode = "IN" (nil) or "OUT",
startAlpha = alpha value to start at,
endAlpha = alpha value to end at,
timeToFade = duration of animation,
startDelay = seconds to wait before starting animation,
fadeHoldTime = seconds to wait after ending animation before calling finishedFunc,
finishedFunc = function to call after animation has ended,
}
If you plan to reuse `info`, it should be passed as a single table,
NOT a reference, as the table will be directly edited.
]]
kui.frameFade = function(frame, info)
if not frame then return end
if kui.frameIsFading(frame) then
-- cancel the current operation
-- the code calling this should make sure not to interrupt a
-- necessary finishedFunc. This will entirely skip it.
kui.frameFadeRemoveFrame(frame)
end
info = info or {}
info.mode = info.mode or 'IN'
if info.mode == 'IN' then
info.startAlpha = info.startAlpha or 0
info.endAlpha = info.endAlpha or 1
elseif info.mode == 'OUT' then
info.startAlpha = info.startAlpha or 1
info.endAlpha = info.endAlpha or 0
end
frame:SetAlpha(info.startAlpha)
frame.fadeInfo = info
tinsert(kui.FADEFRAMES, frame)
kui.frameFadeFrame:SetScript('OnUpdate', kui.frameFadeOnUpdate)
end