330 lines
9.6 KiB
Lua
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 |