mirror of
https://github.com/Bluewhale1337/ElvUIModernized.git
synced 2026-07-28 16:55:29 +00:00
Merge branch 'auras-work' into dev
This commit is contained in:
@@ -10,17 +10,19 @@ local unpack = unpack
|
|||||||
local find, format, gsub, lower, match, upper = string.find, string.format, string.gsub, string.lower, string.match, string.upper
|
local find, format, gsub, lower, match, upper = string.find, string.format, string.gsub, string.lower, string.match, string.upper
|
||||||
local getn = table.getn
|
local getn = table.getn
|
||||||
--WoW API
|
--WoW API
|
||||||
|
local GetInventoryItemTexture = GetInventoryItemTexture
|
||||||
local GetItemInfo = GetItemInfo
|
local GetItemInfo = GetItemInfo
|
||||||
local GetQuestGreenRange = GetQuestGreenRange
|
local GetQuestGreenRange = GetQuestGreenRange
|
||||||
local GetRealZoneText = GetRealZoneText
|
local GetRealZoneText = GetRealZoneText
|
||||||
local IsInInstance = IsInInstance
|
local IsInInstance = IsInInstance
|
||||||
local UnitBuff = UnitBuff
|
--local UnitBuff = UnitBuff
|
||||||
local UnitDebuff = UnitDebuff
|
--local UnitDebuff = UnitDebuff
|
||||||
local UnitLevel = UnitLevel
|
local UnitLevel = UnitLevel
|
||||||
--WoW Variables
|
--WoW Variables
|
||||||
local DUNGEON_DIFFICULTY1 = DUNGEON_DIFFICULTY1
|
local DUNGEON_DIFFICULTY1 = DUNGEON_DIFFICULTY1
|
||||||
local TIMEMANAGER_AM = gsub(TIME_TWELVEHOURAM, "^.-(%w+)$", "%1")
|
local TIMEMANAGER_AM = gsub(TIME_TWELVEHOURAM, "^.-(%w+)$", "%1")
|
||||||
local TIMEMANAGER_PM = gsub(TIME_TWELVEHOURPM, "^.-(%w+)$", "%1")
|
local TIMEMANAGER_PM = gsub(TIME_TWELVEHOURPM, "^.-(%w+)$", "%1")
|
||||||
|
local DURABILITY_TEMPLATE = gsub(DURABILITY_TEMPLATE, "%%d / %%d", "(%%d+) / (%%d+)")
|
||||||
--Libs
|
--Libs
|
||||||
local LBC = LibStub("LibBabble-Class-3.0"):GetLookupTable()
|
local LBC = LibStub("LibBabble-Class-3.0"):GetLookupTable()
|
||||||
local LBZ = LibStub("LibBabble-Zone-3.0"):GetLookupTable()
|
local LBZ = LibStub("LibBabble-Zone-3.0"):GetLookupTable()
|
||||||
@@ -145,11 +147,11 @@ function UnitAura(unit, i, filter)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if not filter or match(filter, "(HELPFUL)") then
|
if not filter or match(filter, "(HELPFUL)") then
|
||||||
local name, rank, aura, count, duration, maxDuration = UnitBuff(unit, i, filter)
|
local texture, count = UnitBuff(unit, i, filter)
|
||||||
return name, rank, aura, count, nil, duration or 0, maxDuration or 0
|
return texture, count
|
||||||
else
|
else
|
||||||
local name, rank, aura, count, dType, duration, maxDuration = UnitDebuff(unit, i, filter)
|
local texture, count, dType = UnitDebuff(unit, i, filter)
|
||||||
return name, rank, aura, count, dType, duration or 0, maxDuration or 0
|
return texture, count, dType
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -271,7 +273,7 @@ function GetPlayerFacing()
|
|||||||
local obj = Minimap
|
local obj = Minimap
|
||||||
for i = 1, obj:GetNumChildren() do
|
for i = 1, obj:GetNumChildren() do
|
||||||
local child = select(i, obj:GetChildren())
|
local child = select(i, obj:GetChildren())
|
||||||
if child and child.GetModel and child:GetModel() == "interface\\minimap\\minimaparrow.m2" then
|
if child and child.GetModel and child:GetModel() == "Interface\\Minimap\\MinimapArrow" then
|
||||||
arrow = child
|
arrow = child
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
@@ -472,4 +474,24 @@ function GetItemCount(itemName)
|
|||||||
end
|
end
|
||||||
|
|
||||||
return count
|
return count
|
||||||
|
end
|
||||||
|
|
||||||
|
local scan
|
||||||
|
function GetInventoryItemDurability(slot)
|
||||||
|
if not GetInventoryItemTexture("player", slot) then return nil, nil end
|
||||||
|
|
||||||
|
if not scan then
|
||||||
|
scan = CreateFrame("GameTooltip", "DurabilityScan", nil, "ShoppingTooltipTemplate")
|
||||||
|
scan:SetOwner(UIParent, "ANCHOR_NONE")
|
||||||
|
end
|
||||||
|
|
||||||
|
scan:ClearLines()
|
||||||
|
scan:SetInventoryItem("player", slot)
|
||||||
|
|
||||||
|
for i = 4, scan:NumLines() do
|
||||||
|
local text = _G[scan:GetName().."TextLeft"..i]:GetText()
|
||||||
|
for durability, max in string.gfind(text, DURABILITY_TEMPLATE) do
|
||||||
|
return tonumber(durability), tonumber(max)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
--[[
|
||||||
|
Classy.lua
|
||||||
|
A wrapper for defining classes that inherit from widgets
|
||||||
|
--]]
|
||||||
|
|
||||||
|
local Classy = LibStub:NewLibrary('Classy-1.0', 0)
|
||||||
|
if not Classy then return end
|
||||||
|
|
||||||
|
function Classy:New(frameType, parentClass)
|
||||||
|
local class = CreateFrame(frameType)
|
||||||
|
class.mt = {__index = class}
|
||||||
|
|
||||||
|
if parentClass then
|
||||||
|
class = setmetatable(class, {__index = parentClass})
|
||||||
|
|
||||||
|
class.super = function(self, method, ...)
|
||||||
|
parentClass[method](self, unpack(arg))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class.Bind = function(self, obj)
|
||||||
|
return setmetatable(obj, self.mt)
|
||||||
|
end
|
||||||
|
|
||||||
|
return class
|
||||||
|
end
|
||||||
@@ -0,0 +1,268 @@
|
|||||||
|
if not LibStub then return end
|
||||||
|
|
||||||
|
local SD = LibStub:GetLibrary('StateDriver-1.0')
|
||||||
|
if not SD then return end
|
||||||
|
|
||||||
|
local Parser = SD:New('Parser')
|
||||||
|
|
||||||
|
local IsMounted = IsMounted
|
||||||
|
local IsStealthed = IsStealthed
|
||||||
|
local GetShapeshiftForm = GetShapeshiftForm
|
||||||
|
|
||||||
|
local _G = getfenv(0)
|
||||||
|
local function IsInShapeshiftForm(index)
|
||||||
|
return GetShapeshiftForm() == tonumber(index)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
function Parser:Initialize()
|
||||||
|
self.casting = nil
|
||||||
|
self.channel_spell = nil
|
||||||
|
self.channeling = nil
|
||||||
|
|
||||||
|
self:RegisterEvent('PLAYER_ENTERING_WORLD')
|
||||||
|
self:RegisterEvent('SPELLCAST_START')
|
||||||
|
self:RegisterEvent('SPELLCAST_CHANNEL_START')
|
||||||
|
self:RegisterEvent('SPELLCAST_STOP')
|
||||||
|
self:RegisterEvent('SPELLCAST_CHANNEL_STOP')
|
||||||
|
-- self:SetScript('OnEvent', function() self[event](self) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
local _CastSpellByName
|
||||||
|
local Hooked_CastSpellByName = function(spell, unit)
|
||||||
|
if spell then
|
||||||
|
self.channel_spell = spell
|
||||||
|
_CastSpellByName(spell, unit)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local HOOKED = false
|
||||||
|
function Parser:PLAYER_ENTERING_WORLD()
|
||||||
|
if not HOOKED then
|
||||||
|
_CastSpellByName = CastSpellByName
|
||||||
|
CastSpellByName = Hooked_CastSpellByName
|
||||||
|
HOOKED = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Parser:SPELLCAST_START()
|
||||||
|
self.casting = arg1
|
||||||
|
end
|
||||||
|
|
||||||
|
function Parser:SPELLCAST_CHANNEL_START()
|
||||||
|
self.channeling = true
|
||||||
|
end
|
||||||
|
|
||||||
|
function Parser:SPELLCAST_STOP()
|
||||||
|
self.casting = false
|
||||||
|
end
|
||||||
|
|
||||||
|
function Parser:SPELLCAST_CHANNEL_STOP()
|
||||||
|
self.channel_spell = nil
|
||||||
|
self.channeling = false
|
||||||
|
end
|
||||||
|
|
||||||
|
local conditions_map, casting, existence, hostility
|
||||||
|
do
|
||||||
|
local function IsChanneling(dependency)
|
||||||
|
return dependency and dependency == Parser.channeling or Parser.channeling
|
||||||
|
end
|
||||||
|
|
||||||
|
local function IsCasting(dependency)
|
||||||
|
return dependency and dependency == Parser.casting or Parser.casting
|
||||||
|
end
|
||||||
|
|
||||||
|
local function IsMouseOverUnit()
|
||||||
|
local is_mouseover = false
|
||||||
|
|
||||||
|
is_mouseover = UnitName('mouseover') and 'mouseover'
|
||||||
|
|
||||||
|
local frame = GetMouseFocus()
|
||||||
|
if frame and frame.GetAttribute then
|
||||||
|
is_mouseover = is_mouseover or frame:GetAttribute('unit')
|
||||||
|
end
|
||||||
|
is_mouseover = is_mouseover or frame and frame.unit
|
||||||
|
|
||||||
|
return is_mouseover
|
||||||
|
end
|
||||||
|
|
||||||
|
local function modifierCondition(dependency)
|
||||||
|
dependency = dependency == 'ctrl' and 'control' or dependency
|
||||||
|
local modifier = string.gsub(dependency, "^%l", string.upper)
|
||||||
|
return _G['Is' .. modifier .. 'KeyDown']()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Rename dependent?
|
||||||
|
casting = {
|
||||||
|
['channeling'] = IsChanneling,
|
||||||
|
['nochanneling'] = function(dependency)
|
||||||
|
return not IsChanneling(dependency)
|
||||||
|
end,
|
||||||
|
['casting'] = IsCasting,
|
||||||
|
['nocasting'] = function(dependency)
|
||||||
|
return not IsCasting(dependency)
|
||||||
|
end,
|
||||||
|
['group'] = function(dependency)
|
||||||
|
local in_raid = UnitInRaid('player')
|
||||||
|
-- Player is apparently always in a party... Party Rock Anthem, GO!
|
||||||
|
local in_party = UnitInParty('party1')
|
||||||
|
|
||||||
|
if dependency then
|
||||||
|
if dependency == 'raid' then
|
||||||
|
return in_raid
|
||||||
|
else
|
||||||
|
return in_party
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return in_raid or in_party
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
['nogroup'] = function(dependency)
|
||||||
|
local in_raid = UnitInRaid('player')
|
||||||
|
local in_party = UnitInParty('party1')
|
||||||
|
|
||||||
|
if dependency then
|
||||||
|
if dependency == 'raid' then
|
||||||
|
return not in_raid
|
||||||
|
else
|
||||||
|
return not in_party
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return (not in_raid) and (not in_party)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
['mod'] = modifierCondition,
|
||||||
|
['modifier'] = modifierCondition,
|
||||||
|
['form'] = IsInShapeshiftForm,
|
||||||
|
['stance'] = IsInShapeshiftForm
|
||||||
|
}
|
||||||
|
|
||||||
|
existence = {
|
||||||
|
['exists'] = UnitExists,
|
||||||
|
['noexists'] = function(unit)
|
||||||
|
return not UnitExists(unit)
|
||||||
|
end,
|
||||||
|
['dead'] = function(unit)
|
||||||
|
return UnitIsDead(unit) and not UnitAura(unit, 'Feign Death')
|
||||||
|
end,
|
||||||
|
['nodead'] = function(unit)
|
||||||
|
return not (UnitIsDead(unit) and not UnitAura(unit, 'Feign Death'))
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
hostility = {
|
||||||
|
['harm'] = function(unit_one, unit_two)
|
||||||
|
return UnitExists(unit_two) and (not UnitIsFriend(unit_one, unit_two))
|
||||||
|
end,
|
||||||
|
['nohelp'] = function(unit_one, unit_two)
|
||||||
|
return UnitExists(unit_two) and (not UnitIsFriend(unit_one, unit_two))
|
||||||
|
end,
|
||||||
|
['help'] = UnitIsFriend,
|
||||||
|
['noharm'] = UnitIsFriend
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
conditions_map = {
|
||||||
|
-- Targets
|
||||||
|
['mouseover'] = IsMouseOverUnit,
|
||||||
|
|
||||||
|
['pet'] = HasPetUI,
|
||||||
|
['nopet'] = function() return not HasPetUI() end,
|
||||||
|
|
||||||
|
['party'] = UnitInParty,
|
||||||
|
['raid'] = UnitInRaid,
|
||||||
|
|
||||||
|
['combat'] = UnitAffectingCombat,
|
||||||
|
|
||||||
|
['mounted'] = IsMounted,
|
||||||
|
-- ['indoors'] = IsIndoors,
|
||||||
|
-- ['outdoors'] = IsOutdoors,
|
||||||
|
['stealth'] = IsStealthed,
|
||||||
|
-- ['swimming'] = IsSwimming,
|
||||||
|
|
||||||
|
['bonusbar'] = function(bar_id)
|
||||||
|
return false
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v in next, casting do conditions_map[k] = v end
|
||||||
|
for k, v in next, existence do conditions_map[k] = v end
|
||||||
|
for k, v in next, hostility do conditions_map[k] = v end
|
||||||
|
end
|
||||||
|
|
||||||
|
function CmdOptionParse(command)
|
||||||
|
-- /action [conditions]
|
||||||
|
local action, conditions
|
||||||
|
|
||||||
|
-- Accumulating condition
|
||||||
|
local acc_condition
|
||||||
|
|
||||||
|
-- Condition-mapped function and dependency argument
|
||||||
|
local func, dependency
|
||||||
|
|
||||||
|
-- [@target]
|
||||||
|
local target, is_cond_target
|
||||||
|
|
||||||
|
if not string.find(command, ';') then
|
||||||
|
command = command .. ' ;'
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Iterate condition cases
|
||||||
|
for _, cases in { string.split(';', command) } do
|
||||||
|
conditions, action = string.match(cases, '%[([^%]]+)%]%s*(.+)')
|
||||||
|
|
||||||
|
-- Does the action have any conditions?
|
||||||
|
if conditions then
|
||||||
|
conditions = { string.split(',', conditions) }
|
||||||
|
acc_condition = true
|
||||||
|
target = nil
|
||||||
|
for _, cond in conditions do
|
||||||
|
cond = string.trim(cond)
|
||||||
|
cond, dependency = string.split(':', cond)
|
||||||
|
|
||||||
|
-- Is the current condition a target command? Usually the first
|
||||||
|
-- condition is
|
||||||
|
is_cond_target =
|
||||||
|
string.match(cond, '@(.*)') or
|
||||||
|
string.match(cond, 'target=(.*)')
|
||||||
|
|
||||||
|
-- Mouseover has a special condition, since unitframes don't
|
||||||
|
-- utilise the mouseover unit, in which case it's mapped to
|
||||||
|
-- player, target, partyN etc.
|
||||||
|
func = conditions_map[is_cond_target or cond]
|
||||||
|
|
||||||
|
if is_cond_target then
|
||||||
|
target = func and func() or is_cond_target
|
||||||
|
else
|
||||||
|
local res
|
||||||
|
|
||||||
|
if hostility[cond] then
|
||||||
|
res = func and func('player', target or 'target')
|
||||||
|
elseif existence[cond] then
|
||||||
|
res = func and func(target or 'target')
|
||||||
|
elseif cond == 'combat' then
|
||||||
|
res = func and func('player')
|
||||||
|
elseif casting[cond] then
|
||||||
|
res = func and func(dependency)
|
||||||
|
else
|
||||||
|
res = func and func()
|
||||||
|
end
|
||||||
|
|
||||||
|
acc_condition = acc_condition and res
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Are all conditions met? Then perform that action
|
||||||
|
if acc_condition then
|
||||||
|
return string.trim(action), target
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local cases = string.trim(cases)
|
||||||
|
return cases
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
SecureCmdOptionParse = CmdOptionParse
|
||||||
|
|
||||||
|
Parser:Initialize()
|
||||||
@@ -0,0 +1,513 @@
|
|||||||
|
--[[
|
||||||
|
Name: StateDriver-1.0
|
||||||
|
Revision: $Rev: 107 $
|
||||||
|
Maintainers: martinjlowm
|
||||||
|
Website: https://github.com/martinjlowm/StateDriver/
|
||||||
|
Dependencies: Classy-1.0
|
||||||
|
License: None
|
||||||
|
]]
|
||||||
|
|
||||||
|
if not LibStub then return end
|
||||||
|
|
||||||
|
local SD = LibStub:NewLibrary('StateDriver-1.0', 0)
|
||||||
|
if not SD then return end
|
||||||
|
|
||||||
|
local Classy = LibStub('Classy-1.0')
|
||||||
|
|
||||||
|
local _G = getfenv(0)
|
||||||
|
|
||||||
|
function SD:New(name, parent)
|
||||||
|
self[name] = Classy:New('Frame', parent)
|
||||||
|
|
||||||
|
return self[name]
|
||||||
|
end
|
||||||
|
|
||||||
|
local function GetAttribute(self, prefix, name, suffix)
|
||||||
|
local attributes = self.__state_driver.attributes
|
||||||
|
local value
|
||||||
|
|
||||||
|
if not name and not suffix then
|
||||||
|
name = prefix
|
||||||
|
else
|
||||||
|
value = attributes[prefix .. name .. suffix]
|
||||||
|
value = value or attributes['*' .. name .. suffix]
|
||||||
|
value = value or attributes[prefix .. name .. '*']
|
||||||
|
value = value or attributes['*' .. name .. '*']
|
||||||
|
end
|
||||||
|
|
||||||
|
return value or attributes[name]
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SetAttribute(self, attr, value)
|
||||||
|
local old_value = self.__state_driver.attributes[attr]
|
||||||
|
self.__state_driver.attributes[attr] = value
|
||||||
|
|
||||||
|
local func = self.__state_driver.handlers['OnAttributeChanged']
|
||||||
|
if func and type(func) == 'function' and value ~= old_value then
|
||||||
|
func(self, attr, value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- Figure out where to place this
|
||||||
|
local function initPlayerDrop()
|
||||||
|
UnitPopup_ShowMenu(PlayerFrameDropDown, "SELF", "player")
|
||||||
|
if not (UnitInRaid("player") or GetNumPartyMembers() > 0) or UnitIsPartyLeader("player") and PlayerFrameDropDown.init and not CanShowResetInstances() then
|
||||||
|
UIDropDownMenu_AddButton({text = RESET_INSTANCES, func = ResetInstances, notCheckable = 1}, 1)
|
||||||
|
PlayerFrameDropDown.init = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local ACTIONS = {}
|
||||||
|
|
||||||
|
ACTIONS.target = function(self, unit, button)
|
||||||
|
if unit then
|
||||||
|
if unit == 'none' then
|
||||||
|
ClearTarget();
|
||||||
|
elseif ( SpellIsTargeting() ) then
|
||||||
|
SpellTargetUnit(unit);
|
||||||
|
elseif ( CursorHasItem() ) then
|
||||||
|
DropItemOnUnit(unit);
|
||||||
|
else
|
||||||
|
TargetUnit(unit);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ACTIONS.togglemenu = function(self, unit, button)
|
||||||
|
if UnitIsUnit(unit, 'player') then
|
||||||
|
UIDropDownMenu_Initialize(PlayerFrameDropDown, initPlayerDrop, 'MENU')
|
||||||
|
PlayerFrameDropDown.init = true
|
||||||
|
ToggleDropDownMenu(1, nil, PlayerFrameDropDown, 'cursor')
|
||||||
|
elseif unit == 'pet' then
|
||||||
|
ToggleDropDownMenu(1, nil, PetFrameDropDown, 'cursor')
|
||||||
|
elseif unit == 'target' then
|
||||||
|
ToggleDropDownMenu(1, nil, TargetFrameDropDown, 'cursor')
|
||||||
|
elseif string.sub(unit, 1, 5) == 'party' then
|
||||||
|
ToggleDropDownMenu(1, nil, _G['PartyMemberFrame' .. string.sub(unit,6) .. 'DropDown'], 'cursor')
|
||||||
|
elseif string.sub(unit, 1, 4) == 'raid' then
|
||||||
|
HideDropDownMenu(1)
|
||||||
|
|
||||||
|
local menuFrame = FriendsDropDown
|
||||||
|
menuFrame.displayMode = 'MENU'
|
||||||
|
menuFrame.id = string.sub(this.unit,5)
|
||||||
|
menuFrame.unit = unit
|
||||||
|
menuFrame.name = UnitName(this.unit)
|
||||||
|
menuFrame.initialize = function()
|
||||||
|
UnitPopup_ShowMenu(getglobal(UIDROPDOWNMENU_OPEN_MENU), "PARTY", self.unit, self.name, self.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
ToggleDropDownMenu(1, nil, FriendsDropDown, 'cursor')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ACTIONS.macro = function(self, unit, button)
|
||||||
|
local macro_text = self:GetAttribute('macrotext')
|
||||||
|
local spell, unit = SecureCmdOptionParse(macro_text)
|
||||||
|
CastSpellByName(spell, unit)
|
||||||
|
end
|
||||||
|
|
||||||
|
ACTIONS.spell = function(self, unit, button)
|
||||||
|
local spell = self:GetAttribute('spell')
|
||||||
|
CastSpellByName(spell)
|
||||||
|
end
|
||||||
|
|
||||||
|
ACTIONS.pet = function(self, unit, button)
|
||||||
|
local index = self:GetAttribute('pet')
|
||||||
|
CastPetAction(index, unit)
|
||||||
|
end
|
||||||
|
|
||||||
|
ACTIONS.func = function(self, unit, button)
|
||||||
|
local func = SlashCmdList[self:GetAttribute('func')]
|
||||||
|
|
||||||
|
if not func then
|
||||||
|
error(string.format('Slash command `%s` does not exist in SlashCmdList'))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
func()
|
||||||
|
end
|
||||||
|
|
||||||
|
local link_pattern = '%[([^%]]+)%]'
|
||||||
|
local function CmdItemParse(item)
|
||||||
|
local slot = tonumber(item)
|
||||||
|
if slot then
|
||||||
|
return nil, nil, slot
|
||||||
|
end
|
||||||
|
|
||||||
|
local link, name
|
||||||
|
for bag = 0, 4 do
|
||||||
|
for slot = 1, GetContainerNumSlots(bag) do
|
||||||
|
link = GetContainerItemLink(bag, slot)
|
||||||
|
|
||||||
|
if link then
|
||||||
|
name = string.match(link, link_pattern)
|
||||||
|
if name and name == item then
|
||||||
|
return name, bag, slot
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ACTIONS.item = function(self, unit, button)
|
||||||
|
local item = self:GetAttribute('item')
|
||||||
|
|
||||||
|
if item then
|
||||||
|
local name, bag, slot = CmdItemParse(item)
|
||||||
|
UseItem(name, bag, slot)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UseItem(name, bag, slot)
|
||||||
|
if bag then
|
||||||
|
UseContainerItem(bag, slot)
|
||||||
|
elseif slot then
|
||||||
|
UseInventoryItem(slot)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ACTIONS.assign = function(self, unit, button)
|
||||||
|
local macro_text = self:GetAttribute('assign')
|
||||||
|
local symbol, unit = SecureCmdOptionParse(macro_text)
|
||||||
|
SetRaidTargetIcon(unit, symbol)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Button_GetModifierPrefix(frame)
|
||||||
|
local prefix = ''
|
||||||
|
prefix = IsShiftKeyDown() and 'shift-' .. prefix or prefix
|
||||||
|
prefix = IsControlKeyDown() and 'ctrl-' .. prefix or prefix
|
||||||
|
return IsAltKeyDown() and 'alt-' .. prefix or prefix
|
||||||
|
end
|
||||||
|
|
||||||
|
function Button_GetButtonSuffix(button)
|
||||||
|
if button == 'LeftButton' then
|
||||||
|
return '1'
|
||||||
|
elseif button == 'RightButton' then
|
||||||
|
return '2'
|
||||||
|
elseif button == 'MiddleButton' then
|
||||||
|
return '3'
|
||||||
|
end
|
||||||
|
|
||||||
|
return '';
|
||||||
|
end
|
||||||
|
|
||||||
|
function Button_GetModifiedAttribute(frame, name, button, prefix, suffix)
|
||||||
|
if not prefix then
|
||||||
|
prefix = Button_GetModifierPrefix(frame)
|
||||||
|
end
|
||||||
|
if not suffix then
|
||||||
|
suffix = Button_GetButtonSuffix(button)
|
||||||
|
end
|
||||||
|
|
||||||
|
return frame:GetAttribute(prefix, name, suffix)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnClick(self, button)
|
||||||
|
if not self.GetAttribute then return end
|
||||||
|
|
||||||
|
local unit = self:GetAttribute('unit')
|
||||||
|
|
||||||
|
local action_type = Button_GetModifiedAttribute(self, 'type', button)
|
||||||
|
|
||||||
|
if action_type then
|
||||||
|
local handler = ACTIONS[action_type]
|
||||||
|
if handler and type(handler) == 'function' then
|
||||||
|
handler(self, unit, button)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SetScript(self, handler, func)
|
||||||
|
if self.__state_driver.handlers[handler] then
|
||||||
|
if self:HasScript(handler) and handler == 'OnClick' then
|
||||||
|
self.__state_driver._SetScript(self, handler, function(...)
|
||||||
|
OnClick(this, arg1)
|
||||||
|
func()
|
||||||
|
end)
|
||||||
|
else
|
||||||
|
self.__state_driver.handlers[handler] = func
|
||||||
|
end
|
||||||
|
else
|
||||||
|
self.__state_driver._SetScript(self, handler, func)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local _CreateFrame = CreateFrame
|
||||||
|
function CreateFrame(...)
|
||||||
|
local frame = _CreateFrame(unpack(arg))
|
||||||
|
|
||||||
|
-- State Driver environment
|
||||||
|
frame.__state_driver = {}
|
||||||
|
|
||||||
|
frame.__state_driver._SetScript = frame.SetScript
|
||||||
|
frame.SetScript = SetScript
|
||||||
|
|
||||||
|
frame.__state_driver.attributes = {}
|
||||||
|
frame.__state_driver.handlers = {
|
||||||
|
['OnAttributeChanged'] = true,
|
||||||
|
['OnClick'] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
frame.GetAttribute = GetAttribute
|
||||||
|
frame.SetAttribute = SetAttribute
|
||||||
|
|
||||||
|
if frame:HasScript('OnClick') and not frame:GetScript('OnClick') then
|
||||||
|
frame:SetScript('OnClick', NOOP)
|
||||||
|
end
|
||||||
|
|
||||||
|
return frame
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Execute(frame, func)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
local function WrapScript(frame, func)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
local function UnwrapScript(frame, func)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ChildUpdate(frame, attr_snippet, value)
|
||||||
|
local children = { frame:GetChildren() }
|
||||||
|
local childUpdate
|
||||||
|
|
||||||
|
for _, child in next, children do
|
||||||
|
if child.GetAttribute then
|
||||||
|
childUpdate = child:GetAttribute('_childupdate-' .. attr_snippet)
|
||||||
|
if childUpdate then
|
||||||
|
childUpdate(child, value)
|
||||||
|
else
|
||||||
|
childUpdate = child:GetAttribute('_childupdate')
|
||||||
|
if childUpdate then
|
||||||
|
childUpdate(child, value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ChildUpdate(child, attr_snippet, value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--
|
||||||
|
-- SecureStateDriverManager
|
||||||
|
-- Automatically sets states based on macro options for state driver frames
|
||||||
|
-- Also handled showing/hiding frames based on unit existence (code originally by Tem)
|
||||||
|
--
|
||||||
|
|
||||||
|
-- Register a frame attribute to be set automatically with changes in game state
|
||||||
|
function RegisterAttributeDriver(frame, attribute, values)
|
||||||
|
frame.Execute = Execute
|
||||||
|
frame.WrapScript = WrapScript
|
||||||
|
frame.UnwrapScript = UnwrapScript
|
||||||
|
frame.ChildUpdate = ChildUpdate
|
||||||
|
if attribute and values and string.sub(attribute, 1, 1) ~= '_' then
|
||||||
|
Manager:SetAttribute('setframe', frame)
|
||||||
|
Manager:SetAttribute('setstate', attribute .. ' ' .. values)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Unregister a frame from the state driver manager.
|
||||||
|
function UnregisterAttributeDriver(frame, attribute)
|
||||||
|
if attribute then
|
||||||
|
Manager:SetAttribute('setframe', frame)
|
||||||
|
Manager:SetAttribute('setstate', attribute)
|
||||||
|
else
|
||||||
|
Manager:SetAttribute('delframe', frame)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Bridge functions for compatibility
|
||||||
|
function RegisterStateDriver(frame, state, values)
|
||||||
|
return RegisterAttributeDriver(frame, 'state-' .. state, values)
|
||||||
|
end
|
||||||
|
|
||||||
|
function UnregisterStateDriver(frame, state)
|
||||||
|
return UnregisterAttributeDriver(frame, 'state-' .. state)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Register a frame to be notified when a unit's existence changes, the
|
||||||
|
-- unit is obtained from the frame's attributes. If asState is true then
|
||||||
|
-- notification is via the 'state-unitexists' attribute with values
|
||||||
|
-- true and false. Otherwise it's via :Show() and :Hide()
|
||||||
|
function RegisterUnitWatch(frame, asState)
|
||||||
|
if asState then
|
||||||
|
Manager:SetAttribute('addwatchstate', frame)
|
||||||
|
else
|
||||||
|
Manager:SetAttribute('addwatch', frame)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Unregister a frame from the unit existence monitor.
|
||||||
|
function UnregisterUnitWatch(frame)
|
||||||
|
SecureStateDriverManager:SetAttribute('removewatch', frame)
|
||||||
|
end
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Private implementation
|
||||||
|
--
|
||||||
|
local secureAttributeDrivers = {}
|
||||||
|
local unitExistsWatchers = {}
|
||||||
|
local unitExistsCache = setmetatable(
|
||||||
|
{},
|
||||||
|
{ __index = function(t,k)
|
||||||
|
local v = UnitExists(k) or false
|
||||||
|
t[k] = v
|
||||||
|
return v
|
||||||
|
end
|
||||||
|
})
|
||||||
|
local STATE_DRIVER_UPDATE_THROTTLE = 0.1
|
||||||
|
local timer = 0
|
||||||
|
|
||||||
|
local wipe = table.wipe
|
||||||
|
|
||||||
|
-- Check to see if a frame is registered
|
||||||
|
function UnitWatchRegistered(frame)
|
||||||
|
return not (unitExistsWatchers[frame] == nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SecureStateDriverManager_UpdateUnitWatch(frame, doState)
|
||||||
|
-- Not really so secure, eh?
|
||||||
|
local unit = frame:GetAttribute('unit')
|
||||||
|
local exists = (unit and unitExistsCache[unit])
|
||||||
|
if doState then
|
||||||
|
local attr = exists or false
|
||||||
|
if frame:GetAttribute('state-unitexists') ~= attr then
|
||||||
|
frame:SetAttribute('state-unitexists', attr)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if exists then
|
||||||
|
frame:Show()
|
||||||
|
frame:SetAttribute('statehidden', nil)
|
||||||
|
else
|
||||||
|
frame:Hide()
|
||||||
|
frame:SetAttribute('statehidden', true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local pairs = pairs
|
||||||
|
|
||||||
|
-- consolidate duplicated code for footprint and maintainability
|
||||||
|
local function resolveDriver(frame, attribute, values)
|
||||||
|
local newValue = SecureCmdOptionParse(values)
|
||||||
|
|
||||||
|
if attribute == 'state-visibility' then
|
||||||
|
if newValue == 'show' then
|
||||||
|
frame:Show()
|
||||||
|
frame:SetAttribute('statehidden', nil)
|
||||||
|
elseif newValue == 'hide' then
|
||||||
|
frame:Hide()
|
||||||
|
frame:SetAttribute('statehidden', true)
|
||||||
|
end
|
||||||
|
elseif newValue then
|
||||||
|
if newValue == 'nil' then
|
||||||
|
newValue = nil
|
||||||
|
else
|
||||||
|
newValue = tonumber(newValue) or newValue
|
||||||
|
end
|
||||||
|
local oldValue = frame:GetAttribute(attribute)
|
||||||
|
if newValue ~= oldValue then
|
||||||
|
frame:SetAttribute(attribute, newValue)
|
||||||
|
local onState = frame:GetAttribute('_on' .. attribute)
|
||||||
|
if onState then
|
||||||
|
onState(frame, attribute, newValue)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnUpdate()
|
||||||
|
local self, elapsed = this, arg1
|
||||||
|
|
||||||
|
timer = timer - elapsed
|
||||||
|
if timer <= 0 then
|
||||||
|
timer = STATE_DRIVER_UPDATE_THROTTLE
|
||||||
|
|
||||||
|
-- Handle state driver updates
|
||||||
|
for frame, drivers in next, secureAttributeDrivers do
|
||||||
|
for attribute, values in next, drivers do
|
||||||
|
resolveDriver(frame, attribute, values)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Handle unit existence changes
|
||||||
|
wipe(unitExistsCache)
|
||||||
|
for k in next, unitExistsCache do
|
||||||
|
unitExistsCache[k] = nil
|
||||||
|
end
|
||||||
|
for frame, doState in next, unitExistsWatchers do
|
||||||
|
SecureStateDriverManager_UpdateUnitWatch(frame, doState)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnEvent()
|
||||||
|
local self, event = this, arg1
|
||||||
|
|
||||||
|
timer = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnAttributeChanged(self, name, value)
|
||||||
|
if not value then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if name == 'setframe' then
|
||||||
|
if not secureAttributeDrivers[value] then
|
||||||
|
secureAttributeDrivers[value] = {}
|
||||||
|
end
|
||||||
|
SecureStateDriverManager:Show()
|
||||||
|
elseif name == 'delframe' then
|
||||||
|
secureAttributeDrivers[value] = nil
|
||||||
|
elseif name == 'setstate' then
|
||||||
|
local frame = self:GetAttribute('setframe')
|
||||||
|
local attribute, values = string.match(value, '^(%S+)%s*(.*)$')
|
||||||
|
|
||||||
|
if values == '' then
|
||||||
|
secureAttributeDrivers[frame][attribute] = nil
|
||||||
|
else
|
||||||
|
secureAttributeDrivers[frame][attribute] = values
|
||||||
|
resolveDriver(frame, attribute, values)
|
||||||
|
end
|
||||||
|
-- Two frames registering with identical setstate fails unless the value
|
||||||
|
-- is reset afterwards
|
||||||
|
self:SetAttribute('setstate', nil)
|
||||||
|
elseif name == 'addwatch' or name == 'addwatchstate' then
|
||||||
|
local doState = (name == 'addwatchstate')
|
||||||
|
unitExistsWatchers[value] = doState
|
||||||
|
SecureStateDriverManager:Show()
|
||||||
|
SecureStateDriverManager_UpdateUnitWatch(value, doState)
|
||||||
|
elseif name == 'removewatch' then
|
||||||
|
unitExistsWatchers[value] = nil
|
||||||
|
elseif name == 'updatetime' then
|
||||||
|
STATE_DRIVER_UPDATE_THROTTLE = value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
Manager = SD:New('Manager')
|
||||||
|
Manager:SetScript('OnUpdate', OnUpdate)
|
||||||
|
Manager:SetScript('OnEvent', OnEvent)
|
||||||
|
Manager:SetScript('OnAttributeChanged', OnAttributeChanged)
|
||||||
|
|
||||||
|
-- Events that trigger early rescans
|
||||||
|
Manager:RegisterEvent('MODIFIER_STATE_CHANGED')
|
||||||
|
Manager:RegisterEvent('ACTIONBAR_PAGE_CHANGED')
|
||||||
|
Manager:RegisterEvent('UPDATE_BONUS_ACTIONBAR')
|
||||||
|
Manager:RegisterEvent('PLAYER_ENTERING_WORLD')
|
||||||
|
Manager:RegisterEvent('UPDATE_SHAPESHIFT_FORM')
|
||||||
|
Manager:RegisterEvent('UPDATE_STEALTH')
|
||||||
|
Manager:RegisterEvent('PLAYER_TARGET_CHANGED')
|
||||||
|
Manager:RegisterEvent('PLAYER_FOCUS_CHANGED')
|
||||||
|
Manager:RegisterEvent('PLAYER_REGEN_DISABLED')
|
||||||
|
Manager:RegisterEvent('PLAYER_REGEN_ENABLED')
|
||||||
|
Manager:RegisterEvent('UNIT_PET')
|
||||||
|
Manager:RegisterEvent('GROUP_ROSTER_UPDATE')
|
||||||
|
-- Deliberately ignoring mouseover and others' target changes because they change so much
|
||||||
|
|
||||||
|
_G['SecureStateDriverManager'] = Manager
|
||||||
@@ -6,6 +6,7 @@ local Sticky = LibStub("LibSimpleSticky-1.0");
|
|||||||
local _G = _G
|
local _G = _G
|
||||||
local type, unpack, pairs = type, unpack, pairs
|
local type, unpack, pairs = type, unpack, pairs
|
||||||
local format, split, find = string.format, string.split, string.find
|
local format, split, find = string.format, string.split, string.find
|
||||||
|
local tinsert = table.insert
|
||||||
--WoW API / Variables
|
--WoW API / Variables
|
||||||
local CreateFrame = CreateFrame
|
local CreateFrame = CreateFrame
|
||||||
|
|
||||||
@@ -72,7 +73,7 @@ local function CreateMover(parent, name, text, overlay, snapOffset, postdrag, sh
|
|||||||
end
|
end
|
||||||
|
|
||||||
E.CreatedMovers[name].mover = f
|
E.CreatedMovers[name].mover = f
|
||||||
E["snapBars"][getn(E["snapBars"]) + 1] = f
|
tinsert(E["snapBars"], f)
|
||||||
|
|
||||||
local fs = f:CreateFontString(nil, "OVERLAY")
|
local fs = f:CreateFontString(nil, "OVERLAY")
|
||||||
E:FontTemplate(fs)
|
E:FontTemplate(fs)
|
||||||
|
|||||||
+11
-21
@@ -25,25 +25,21 @@ E.PopupDialogs["ELVUI_UPDATE_AVAILABLE"] = {
|
|||||||
OnShow = function()
|
OnShow = function()
|
||||||
this.editBox:SetAutoFocus(false)
|
this.editBox:SetAutoFocus(false)
|
||||||
this.editBox.width = this.editBox:GetWidth()
|
this.editBox.width = this.editBox:GetWidth()
|
||||||
this.editBox:SetWidth(220)
|
E:Width(this.editBox, 220)
|
||||||
this.editBox:SetText("https://github.com/ElvUI-Vanilla/ElvUI")
|
this.editBox:SetText("https://github.com/ElvUI-Vanilla/ElvUI")
|
||||||
this.editBox:HighlightText()
|
this.editBox:HighlightText()
|
||||||
-- ChatEdit_FocusActiveWindow()
|
|
||||||
end,
|
end,
|
||||||
OnHide = function()
|
OnHide = function()
|
||||||
this.editBox:SetWidth(this.editBox.width or 50)
|
E:Width(this.editBox, this.editBox.width or 50)
|
||||||
this.editBox.width = nil
|
this.editBox.width = nil
|
||||||
end,
|
end,
|
||||||
hideOnEscape = 1,
|
hideOnEscape = 1,
|
||||||
button1 = OKAY,
|
button1 = OKAY,
|
||||||
button2 = CLOSE, -- Temporary until further fix
|
|
||||||
OnAccept = E.noop,
|
OnAccept = E.noop,
|
||||||
EditBoxOnEnterPressed = function()
|
EditBoxOnEnterPressed = function()
|
||||||
-- ChatEdit_FocusActiveWindow()
|
|
||||||
this:GetParent():Hide()
|
this:GetParent():Hide()
|
||||||
end,
|
end,
|
||||||
EditBoxOnEscapePressed = function()
|
EditBoxOnEscapePressed = function()
|
||||||
-- ChatEdit_FocusActiveWindow()
|
|
||||||
this:GetParent():Hide()
|
this:GetParent():Hide()
|
||||||
end,
|
end,
|
||||||
EditBoxOnTextChanged = function()
|
EditBoxOnTextChanged = function()
|
||||||
@@ -52,7 +48,6 @@ E.PopupDialogs["ELVUI_UPDATE_AVAILABLE"] = {
|
|||||||
end
|
end
|
||||||
this:HighlightText()
|
this:HighlightText()
|
||||||
this:ClearFocus()
|
this:ClearFocus()
|
||||||
-- ChatEdit_FocusActiveWindow()
|
|
||||||
end,
|
end,
|
||||||
OnEditFocusGained = function()
|
OnEditFocusGained = function()
|
||||||
this:HighlightText()
|
this:HighlightText()
|
||||||
@@ -63,7 +58,6 @@ E.PopupDialogs["ELVUI_UPDATE_AVAILABLE"] = {
|
|||||||
E.PopupDialogs["CLIQUE_ADVERT"] = {
|
E.PopupDialogs["CLIQUE_ADVERT"] = {
|
||||||
text = L["Using the healer layout it is highly recommended you download the addon Clique if you wish to have the click-to-heal function."],
|
text = L["Using the healer layout it is highly recommended you download the addon Clique if you wish to have the click-to-heal function."],
|
||||||
button1 = YES,
|
button1 = YES,
|
||||||
button2 = CLOSE, -- Temporary until further fix
|
|
||||||
OnAccept = E.noop,
|
OnAccept = E.noop,
|
||||||
showAlert = 1
|
showAlert = 1
|
||||||
}
|
}
|
||||||
@@ -127,7 +121,6 @@ E.PopupDialogs["INCOMPATIBLE_ADDON"] = {
|
|||||||
E.PopupDialogs["PIXELPERFECT_CHANGED"] = {
|
E.PopupDialogs["PIXELPERFECT_CHANGED"] = {
|
||||||
text = L["You have changed the Thin Border Theme option. You will have to complete the installation process to remove any graphical bugs."],
|
text = L["You have changed the Thin Border Theme option. You will have to complete the installation process to remove any graphical bugs."],
|
||||||
button1 = ACCEPT,
|
button1 = ACCEPT,
|
||||||
button2 = CLOSE, -- Temporary until further fix
|
|
||||||
OnAccept = E.noop,
|
OnAccept = E.noop,
|
||||||
timeout = 0,
|
timeout = 0,
|
||||||
whileDead = 1,
|
whileDead = 1,
|
||||||
@@ -137,7 +130,6 @@ E.PopupDialogs["PIXELPERFECT_CHANGED"] = {
|
|||||||
E.PopupDialogs["CONFIGAURA_SET"] = {
|
E.PopupDialogs["CONFIGAURA_SET"] = {
|
||||||
text = L["Because of the mass confusion caused by the new aura system I've implemented a new step to the installation process. This is optional. If you like how your auras are setup go to the last step and click finished to not be prompted again. If for some reason you are prompted repeatedly please restart your game."],
|
text = L["Because of the mass confusion caused by the new aura system I've implemented a new step to the installation process. This is optional. If you like how your auras are setup go to the last step and click finished to not be prompted again. If for some reason you are prompted repeatedly please restart your game."],
|
||||||
button1 = ACCEPT,
|
button1 = ACCEPT,
|
||||||
button2 = CLOSE, -- Temporary until further fix
|
|
||||||
OnAccept = E.noop,
|
OnAccept = E.noop,
|
||||||
timeout = 0,
|
timeout = 0,
|
||||||
whileDead = 1,
|
whileDead = 1,
|
||||||
@@ -235,7 +227,6 @@ E.PopupDialogs["BUY_BANK_SLOT"] = {
|
|||||||
E.PopupDialogs["CANNOT_BUY_BANK_SLOT"] = {
|
E.PopupDialogs["CANNOT_BUY_BANK_SLOT"] = {
|
||||||
text = L["Can't buy anymore slots!"],
|
text = L["Can't buy anymore slots!"],
|
||||||
button1 = ACCEPT,
|
button1 = ACCEPT,
|
||||||
button2 = CLOSE, -- Temporary until further fix
|
|
||||||
timeout = 0,
|
timeout = 0,
|
||||||
whileDead = 1
|
whileDead = 1
|
||||||
}
|
}
|
||||||
@@ -243,7 +234,6 @@ E.PopupDialogs["CANNOT_BUY_BANK_SLOT"] = {
|
|||||||
E.PopupDialogs["NO_BANK_BAGS"] = {
|
E.PopupDialogs["NO_BANK_BAGS"] = {
|
||||||
text = L["You must purchase a bank slot first!"],
|
text = L["You must purchase a bank slot first!"],
|
||||||
button1 = ACCEPT,
|
button1 = ACCEPT,
|
||||||
button2 = CLOSE, -- Temporary until further fix
|
|
||||||
timeout = 0,
|
timeout = 0,
|
||||||
whileDead = 1
|
whileDead = 1
|
||||||
}
|
}
|
||||||
@@ -262,7 +252,6 @@ E.PopupDialogs["RESETUI_CHECK"] = {
|
|||||||
E.PopupDialogs["HARLEM_SHAKE"] = {
|
E.PopupDialogs["HARLEM_SHAKE"] = {
|
||||||
text = L["ElvUI needs to perform database optimizations please be patient."],
|
text = L["ElvUI needs to perform database optimizations please be patient."],
|
||||||
button1 = OKAY,
|
button1 = OKAY,
|
||||||
button2 = CLOSE, -- Temporary until further fix
|
|
||||||
OnAccept = function()
|
OnAccept = function()
|
||||||
if E.isMassiveShaking then
|
if E.isMassiveShaking then
|
||||||
E:StopHarlemShake()
|
E:StopHarlemShake()
|
||||||
@@ -278,7 +267,6 @@ E.PopupDialogs["HARLEM_SHAKE"] = {
|
|||||||
E.PopupDialogs["HELLO_KITTY"] = {
|
E.PopupDialogs["HELLO_KITTY"] = {
|
||||||
text = L["ElvUI needs to perform database optimizations please be patient."],
|
text = L["ElvUI needs to perform database optimizations please be patient."],
|
||||||
button1 = OKAY,
|
button1 = OKAY,
|
||||||
button2 = CLOSE, -- Temporary until further fix
|
|
||||||
OnAccept = function()
|
OnAccept = function()
|
||||||
E:SetupHelloKitty()
|
E:SetupHelloKitty()
|
||||||
end,
|
end,
|
||||||
@@ -645,7 +633,7 @@ function E:StaticPopup_Resize(dialog, which)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if width > maxWidthSoFar then
|
if width > maxWidthSoFar then
|
||||||
dialog:SetWidth(width)
|
E:Width(dialog, width)
|
||||||
dialog.maxWidthSoFar = width
|
dialog.maxWidthSoFar = width
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -657,7 +645,7 @@ function E:StaticPopup_Resize(dialog, which)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if height > maxHeightSoFar then
|
if height > maxHeightSoFar then
|
||||||
dialog:SetHeight(height)
|
E:Height(dialog, height)
|
||||||
dialog.maxHeightSoFar = height
|
dialog.maxHeightSoFar = height
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -773,9 +761,9 @@ function E:StaticPopup_Show(which, text_arg1, text_arg2, data)
|
|||||||
end
|
end
|
||||||
editBox:SetText("")
|
editBox:SetText("")
|
||||||
if info.editBoxWidth then
|
if info.editBoxWidth then
|
||||||
editBox:SetWidth(info.editBoxWidth)
|
E:Width(editBox, info.editBoxWidth)
|
||||||
else
|
else
|
||||||
editBox:SetWidth(130)
|
E:Width(editBox, 130)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
editBox:Hide()
|
editBox:Hide()
|
||||||
@@ -804,7 +792,9 @@ function E:StaticPopup_Show(which, text_arg1, text_arg2, data)
|
|||||||
tinsert(tempButtonLocs, button2)
|
tinsert(tempButtonLocs, button2)
|
||||||
|
|
||||||
for i = getn(tempButtonLocs), 1, -1 do
|
for i = getn(tempButtonLocs), 1, -1 do
|
||||||
tempButtonLocs[i]:SetText(info["button"..i])
|
if info["button"..i] then
|
||||||
|
tempButtonLocs[i]:SetText(info["button"..i])
|
||||||
|
end
|
||||||
tempButtonLocs[i]:Hide()
|
tempButtonLocs[i]:Hide()
|
||||||
tempButtonLocs[i]:ClearAllPoints()
|
tempButtonLocs[i]:ClearAllPoints()
|
||||||
if not (info["button"..i] and (not info["DisplayButton"..i] or info["DisplayButton"..i](dialog))) then
|
if not (info["button"..i] and (not info["DisplayButton"..i] or info["DisplayButton"..i](dialog))) then
|
||||||
@@ -827,9 +817,9 @@ function E:StaticPopup_Show(which, text_arg1, text_arg2, data)
|
|||||||
|
|
||||||
local width = tempButtonLocs[i]:GetTextWidth()
|
local width = tempButtonLocs[i]:GetTextWidth()
|
||||||
if width > 110 then
|
if width > 110 then
|
||||||
tempButtonLocs[i]:SetWidth(width + 20)
|
E:Width(tempButtonLocs[i], width + 20)
|
||||||
else
|
else
|
||||||
tempButtonLocs[i]:SetWidth(120)
|
E:Width(tempButtonLocs[i], 120)
|
||||||
end
|
end
|
||||||
tempButtonLocs[i]:Enable()
|
tempButtonLocs[i]:Enable()
|
||||||
tempButtonLocs[i]:Show()
|
tempButtonLocs[i]:Show()
|
||||||
|
|||||||
+5
-4
@@ -15,7 +15,6 @@ local GetActiveTalentGroup = GetActiveTalentGroup
|
|||||||
local GetCVar = GetCVar
|
local GetCVar = GetCVar
|
||||||
local GetFunctionCPUUsage = GetFunctionCPUUsage
|
local GetFunctionCPUUsage = GetFunctionCPUUsage
|
||||||
local GetTalentTabInfo = GetTalentTabInfo
|
local GetTalentTabInfo = GetTalentTabInfo
|
||||||
local InCombatLockdown = InCombatLockdown
|
|
||||||
local IsAddOnLoaded = IsAddOnLoaded
|
local IsAddOnLoaded = IsAddOnLoaded
|
||||||
local IsInInstance, GetNumPartyMembers, GetNumRaidMembers = IsInInstance, GetNumPartyMembers, GetNumRaidMembers
|
local IsInInstance, GetNumPartyMembers, GetNumRaidMembers = IsInInstance, GetNumPartyMembers, GetNumRaidMembers
|
||||||
local RequestBattlefieldScoreData = RequestBattlefieldScoreData
|
local RequestBattlefieldScoreData = RequestBattlefieldScoreData
|
||||||
@@ -28,6 +27,8 @@ local RAID_CLASS_COLORS = RAID_CLASS_COLORS
|
|||||||
_, E.myclass = UnitClass("player") -- Constants
|
_, E.myclass = UnitClass("player") -- Constants
|
||||||
_, E.myrace = UnitRace("player")
|
_, E.myrace = UnitRace("player")
|
||||||
_, E.myfaction = UnitFactionGroup("player")
|
_, E.myfaction = UnitFactionGroup("player")
|
||||||
|
-- The E.myfaction may error when in GM mode
|
||||||
|
E.myfaction = E.myfaction or "Others"
|
||||||
E.myname = UnitName("player")
|
E.myname = UnitName("player")
|
||||||
E.version = GetAddOnMetadata("ElvUI", "Version")
|
E.version = GetAddOnMetadata("ElvUI", "Version")
|
||||||
E.myrealm = GetRealmName()
|
E.myrealm = GetRealmName()
|
||||||
@@ -425,9 +426,9 @@ end
|
|||||||
E.UIParent = CreateFrame("Frame", "ElvUIParent", UIParent)
|
E.UIParent = CreateFrame("Frame", "ElvUIParent", UIParent)
|
||||||
E.UIParent:SetFrameLevel(UIParent:GetFrameLevel())
|
E.UIParent:SetFrameLevel(UIParent:GetFrameLevel())
|
||||||
E.UIParent:SetPoint("CENTER", UIParent, "CENTER")
|
E.UIParent:SetPoint("CENTER", UIParent, "CENTER")
|
||||||
E.UIParent:SetHeight(UIParent:GetHeight())
|
E.UIParent:SetHeight(GetScreenHeight())
|
||||||
E.UIParent:SetWidth(UIParent:GetWidth())
|
E.UIParent:SetWidth(GetScreenWidth())
|
||||||
E["snapBars"][table.getn(E["snapBars"]) + 1] = E.UIParent
|
tinsert(E["snapBars"], E.UIParent)
|
||||||
|
|
||||||
E.HiddenFrame = CreateFrame("Frame")
|
E.HiddenFrame = CreateFrame("Frame")
|
||||||
E.HiddenFrame:Hide()
|
E.HiddenFrame:Hide()
|
||||||
|
|||||||
+2
-14
@@ -558,7 +558,7 @@ function E:SetupLayout(layout, noDataReset)
|
|||||||
E.db.unitframe.units.arena.castbar.width = 200
|
E.db.unitframe.units.arena.castbar.width = 200
|
||||||
end
|
end
|
||||||
|
|
||||||
if(layout == "dpsCaster" or layout == "healer" or (layout == "dpsMelee" and E.myclass == "HUNTER")) then
|
if layout == "dpsCaster" or layout == "healer" or (layout == "dpsMelee" and E.myclass == "HUNTER") then
|
||||||
if not E.db.movers then E.db.movers = {} end
|
if not E.db.movers then E.db.movers = {} end
|
||||||
E.db.unitframe.units.player.castbar.width = E.PixelMode and 406 or 436
|
E.db.unitframe.units.player.castbar.width = E.PixelMode and 406 or 436
|
||||||
E.db.unitframe.units.player.castbar.height = 28
|
E.db.unitframe.units.player.castbar.height = 28
|
||||||
@@ -664,18 +664,6 @@ local function SetupAuras(style)
|
|||||||
UF:Configure_AuraBars(frame)
|
UF:Configure_AuraBars(frame)
|
||||||
end
|
end
|
||||||
|
|
||||||
frame = UF["focus"]
|
|
||||||
E:CopyTable(E.db.unitframe.units.focus.buffs, P.unitframe.units.focus.buffs)
|
|
||||||
E:CopyTable(E.db.unitframe.units.focus.debuffs, P.unitframe.units.focus.debuffs)
|
|
||||||
E:CopyTable(E.db.unitframe.units.focus.aurabar, P.unitframe.units.focus.aurabar)
|
|
||||||
E.db.unitframe.units.focus.smartAuraDisplay = P.unitframe.units.focus.smartAuraDisplay
|
|
||||||
|
|
||||||
if frame then
|
|
||||||
UF:Configure_Auras(frame, "Buffs")
|
|
||||||
UF:Configure_Auras(frame, "Debuffs")
|
|
||||||
UF:Configure_AuraBars(frame)
|
|
||||||
end
|
|
||||||
|
|
||||||
if not style then
|
if not style then
|
||||||
E.db.unitframe.units.player.buffs.enable = true
|
E.db.unitframe.units.player.buffs.enable = true
|
||||||
E.db.unitframe.units.player.buffs.attachTo = "FRAME"
|
E.db.unitframe.units.player.buffs.attachTo = "FRAME"
|
||||||
@@ -690,7 +678,7 @@ local function SetupAuras(style)
|
|||||||
E:GetModule("UnitFrames"):CreateAndUpdateUF("target")
|
E:GetModule("UnitFrames"):CreateAndUpdateUF("target")
|
||||||
end
|
end
|
||||||
|
|
||||||
if(InstallStepComplete) then
|
if InstallStepComplete then
|
||||||
InstallStepComplete.message = L["Auras Set"]
|
InstallStepComplete.message = L["Auras Set"]
|
||||||
InstallStepComplete:Show()
|
InstallStepComplete:Show()
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ local byte = string.byte
|
|||||||
local LibBase64 = LibStub:NewLibrary("LibBase64-1.0", 1)
|
local LibBase64 = LibStub:NewLibrary("LibBase64-1.0", 1)
|
||||||
|
|
||||||
if not LibBase64 then
|
if not LibBase64 then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
|
local _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
|
||||||
@@ -25,12 +25,12 @@ local byteToNum = {}
|
|||||||
local numToChar = {}
|
local numToChar = {}
|
||||||
|
|
||||||
for i = 1, strlen(_chars) do
|
for i = 1, strlen(_chars) do
|
||||||
charTable[i] = sub(_chars, i, i)
|
charTable[i] = sub(_chars, i, i)
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 1, getn(charTable) do
|
for i = 1, getn(charTable) do
|
||||||
numToChar[i - 1] = sub(_chars, i, i)
|
numToChar[i - 1] = sub(_chars, i, i)
|
||||||
byteToNum[byte(_chars, i)] = i - 1
|
byteToNum[byte(_chars, i)] = i - 1
|
||||||
end
|
end
|
||||||
|
|
||||||
_chars = nil
|
_chars = nil
|
||||||
@@ -45,10 +45,10 @@ local plus_byte = byte("+")
|
|||||||
local slash_byte = byte("/")
|
local slash_byte = byte("/")
|
||||||
local equals_byte = byte("=")
|
local equals_byte = byte("=")
|
||||||
local whitespace = {
|
local whitespace = {
|
||||||
[byte(" ")] = true,
|
[byte(" ")] = true,
|
||||||
[byte("\t")] = true,
|
[byte("\t")] = true,
|
||||||
[byte("\n")] = true,
|
[byte("\n")] = true,
|
||||||
[byte("\r")] = true,
|
[byte("\r")] = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
local t = {}
|
local t = {}
|
||||||
@@ -60,27 +60,27 @@ local t = {}
|
|||||||
-- @usage LibBase64.Encode("Hello, how are you doing today?") == "SGVsbG8sIGhvdyBhcmUgeW91IGRvaW5nIHRvZGF5Pw=="
|
-- @usage LibBase64.Encode("Hello, how are you doing today?") == "SGVsbG8sIGhvdyBhcmUgeW91IGRvaW5nIHRvZGF5Pw=="
|
||||||
-- @return a Base64-encoded string
|
-- @return a Base64-encoded string
|
||||||
function LibBase64:Encode(text, maxLineLength, lineEnding)
|
function LibBase64:Encode(text, maxLineLength, lineEnding)
|
||||||
if type(text) ~= "string" then
|
if type(text) ~= "string" then
|
||||||
error(format("Bad argument #1 to `Encode'. Expected %q, got %q", "string", type(text)), 2)
|
error(format("Bad argument #1 to `Encode'. Expected %q, got %q", "string", type(text)), 2)
|
||||||
end
|
end
|
||||||
|
|
||||||
if maxLineLength == nil then
|
if maxLineLength == nil then
|
||||||
-- do nothing
|
-- do nothing
|
||||||
elseif type(maxLineLength) ~= "number" then
|
elseif type(maxLineLength) ~= "number" then
|
||||||
error(format("Bad argument #2 to `Encode'. Expected %q or %q, got %q", "number", "nil", type(maxLineLength)), 2)
|
error(format("Bad argument #2 to `Encode'. Expected %q or %q, got %q", "number", "nil", type(maxLineLength)), 2)
|
||||||
elseif modf(maxLineLength, 4) ~= 0 then
|
elseif modf(maxLineLength, 4) ~= 0 then
|
||||||
error(format("Bad argument #2 to `Encode'. Expected a multiple of 4, got %s", maxLineLength), 2)
|
error(format("Bad argument #2 to `Encode'. Expected a multiple of 4, got %s", maxLineLength), 2)
|
||||||
elseif maxLineLength <= 0 then
|
elseif maxLineLength <= 0 then
|
||||||
error(format("Bad argument #2 to `Encode'. Expected a number > 0, got %s", maxLineLength), 2)
|
error(format("Bad argument #2 to `Encode'. Expected a number > 0, got %s", maxLineLength), 2)
|
||||||
end
|
end
|
||||||
|
|
||||||
if lineEnding == nil then
|
if lineEnding == nil then
|
||||||
lineEnding = "\r\n"
|
lineEnding = "\r\n"
|
||||||
elseif type(lineEnding) ~= "string" then
|
elseif type(lineEnding) ~= "string" then
|
||||||
error(format("Bad argument #3 to `Encode'. Expected %q, got %q", "string", type(lineEnding)), 2)
|
error(format("Bad argument #3 to `Encode'. Expected %q, got %q", "string", type(lineEnding)), 2)
|
||||||
end
|
end
|
||||||
|
|
||||||
local currentLength = 0
|
local currentLength = 0
|
||||||
|
|
||||||
for i = 1, getn(text), 3 do
|
for i = 1, getn(text), 3 do
|
||||||
local a, b, c = byte(text, i, i+2)
|
local a, b, c = byte(text, i, i+2)
|
||||||
@@ -116,7 +116,7 @@ function LibBase64:Encode(text, maxLineLength, lineEnding)
|
|||||||
|
|
||||||
currentLength = currentLength + 4
|
currentLength = currentLength + 4
|
||||||
if maxLineLength and modf(currentLength, maxLineLength) == 0 then
|
if maxLineLength and modf(currentLength, maxLineLength) == 0 then
|
||||||
t[getn(t)+1] = lineEnding
|
t[getn(t)+1] = lineEnding
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -136,29 +136,29 @@ local t2 = {}
|
|||||||
-- @usage LibBase64.Encode("SGVsbG8sIGhvdyBhcmUgeW91IGRvaW5nIHRvZGF5Pw==") == "Hello, how are you doing today?"
|
-- @usage LibBase64.Encode("SGVsbG8sIGhvdyBhcmUgeW91IGRvaW5nIHRvZGF5Pw==") == "Hello, how are you doing today?"
|
||||||
-- @return a bytestring
|
-- @return a bytestring
|
||||||
function LibBase64:Decode(text)
|
function LibBase64:Decode(text)
|
||||||
if type(text) ~= "string" then
|
if type(text) ~= "string" then
|
||||||
error(format("Bad argument #1 to `Decode'. Expected %q, got %q", "string", type(text)), 2)
|
error(format("Bad argument #1 to `Decode'. Expected %q, got %q", "string", type(text)), 2)
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 1, getn(text) do
|
for i = 1, getn(text) do
|
||||||
local byte = byte(text, i)
|
local byte = byte(text, i)
|
||||||
if whitespace[byte] or byte == equals_byte then
|
if whitespace[byte] or byte == equals_byte then
|
||||||
-- do nothing
|
-- do nothing
|
||||||
else
|
else
|
||||||
local num = byteToNum[byte]
|
local num = byteToNum[byte]
|
||||||
if not num then
|
if not num then
|
||||||
for i = 1, getn(t2) do
|
for i = 1, getn(t2) do
|
||||||
t2[k] = nil
|
t2[k] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
error(format("Bad argument #1 to `Decode'. Received an invalid char: %q", sub(text, i, i)), 2)
|
error(format("Bad argument #1 to `Decode'. Received an invalid char: %q", sub(text, i, i)), 2)
|
||||||
end
|
end
|
||||||
t2[getn(t2)+1] = num
|
t2[getn(t2)+1] = num
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 1, getn(t2), 4 do
|
for i = 1, getn(t2), 4 do
|
||||||
local a, b, c, d = t2[i], t2[i+1], t2[i+2], t2[i+3]
|
local a, b, c, d = t2[i], t2[i+1], t2[i+2], t2[i+3]
|
||||||
|
|
||||||
local nilNum = 0
|
local nilNum = 0
|
||||||
if not c then
|
if not c then
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ function LibCompress:TableToString(t)
|
|||||||
if t == nil then return nil end
|
if t == nil then return nil end
|
||||||
if type(t)=="string" then return t end
|
if type(t)=="string" then return t end
|
||||||
local cache={}
|
local cache={}
|
||||||
local function sub_mod(t)
|
local function sub_mod(t)
|
||||||
if (type(t)=="table") then
|
if (type(t)=="table") then
|
||||||
for pos,val in pairs(t) do
|
for pos,val in pairs(t) do
|
||||||
if (type(val)=="table") then
|
if (type(val)=="table") then
|
||||||
@@ -153,8 +153,8 @@ function LibCompress:TableToString(t)
|
|||||||
else
|
else
|
||||||
table_insert(cache, tostring(t))
|
table_insert(cache, tostring(t))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
sub_mod(t)
|
sub_mod(t)
|
||||||
return table_concat(cache, ",") -- ? maybe use a different delimiter
|
return table_concat(cache, ",") -- ? maybe use a different delimiter
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -784,10 +784,10 @@ function LibCompress:Compress(data)
|
|||||||
n = compression_methods[method](self, data)
|
n = compression_methods[method](self, data)
|
||||||
nTable = {}
|
nTable = {}
|
||||||
for i = 1, strlen(n) do
|
for i = 1, strlen(n) do
|
||||||
nTable[i] = string.sub(n, i, i)
|
nTable[i] = string.sub(n, i, i)
|
||||||
end
|
end
|
||||||
for i = 1, strlen(result) do
|
for i = 1, strlen(result) do
|
||||||
rTable[i] = string.sub(result, i, i)
|
rTable[i] = string.sub(result, i, i)
|
||||||
end
|
end
|
||||||
if getn(nTable) < getn(rTable) then
|
if getn(nTable) < getn(rTable) then
|
||||||
result = nTable
|
result = nTable
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ end
|
|||||||
function Lib:MatchAll(search)
|
function Lib:MatchAll(search)
|
||||||
for phrase in gmatch(self:Clean(search), '[^&]+') do
|
for phrase in gmatch(self:Clean(search), '[^&]+') do
|
||||||
if not self:MatchAny(phrase) then
|
if not self:MatchAny(phrase) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ end
|
|||||||
function Lib:MatchAny(search)
|
function Lib:MatchAny(search)
|
||||||
for phrase in gmatch(search, '[^|]+') do
|
for phrase in gmatch(search, '[^|]+') do
|
||||||
if self:Match(phrase) then
|
if self:Match(phrase) then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -161,10 +161,10 @@ local escapes = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
local function CleanString(str)
|
local function CleanString(str)
|
||||||
for k, v in pairs(escapes) do
|
for k, v in pairs(escapes) do
|
||||||
str = string.gsub(str, k, v)
|
str = string.gsub(str, k, v)
|
||||||
end
|
end
|
||||||
return str
|
return str
|
||||||
end
|
end
|
||||||
|
|
||||||
Lib.Filters.tipPhrases = {
|
Lib.Filters.tipPhrases = {
|
||||||
@@ -203,9 +203,9 @@ Lib.Filters.tipPhrases = {
|
|||||||
cache = setmetatable({}, {__index = function(t, k) local v = {} t[k] = v return v end}),
|
cache = setmetatable({}, {__index = function(t, k) local v = {} t[k] = v return v end}),
|
||||||
|
|
||||||
keywords = {
|
keywords = {
|
||||||
[lower(ITEM_SOULBOUND)] = ITEM_BIND_ON_PICKUP,
|
[lower(ITEM_SOULBOUND)] = ITEM_BIND_ON_PICKUP,
|
||||||
["bound"] = ITEM_BIND_ON_PICKUP,
|
["bound"] = ITEM_BIND_ON_PICKUP,
|
||||||
["bop"] = ITEM_BIND_ON_PICKUP,
|
["bop"] = ITEM_BIND_ON_PICKUP,
|
||||||
["boe"] = ITEM_BIND_ON_EQUIP,
|
["boe"] = ITEM_BIND_ON_EQUIP,
|
||||||
["bou"] = ITEM_BIND_ON_USE
|
["bou"] = ITEM_BIND_ON_USE
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ local StickyFrames, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
|
|||||||
|
|
||||||
if not StickyFrames then return end
|
if not StickyFrames then return end
|
||||||
|
|
||||||
|
local ipairs = ipairs
|
||||||
|
|
||||||
--[[---------------------------------------------------------------------------------
|
--[[---------------------------------------------------------------------------------
|
||||||
Class declaration, along with a temporary table to hold any existing OnUpdate
|
Class declaration, along with a temporary table to hold any existing OnUpdate
|
||||||
scripts.
|
scripts.
|
||||||
@@ -134,8 +136,7 @@ function StickyFrames:GetUpdateFunc(frame, frameList, xoffset, yoffset, left, to
|
|||||||
frame:SetPoint("CENTER", UIParent, "BOTTOMLEFT", x+xoffset, y+yoffset)
|
frame:SetPoint("CENTER", UIParent, "BOTTOMLEFT", x+xoffset, y+yoffset)
|
||||||
|
|
||||||
StickyFrames.sticky[frame] = nil
|
StickyFrames.sticky[frame] = nil
|
||||||
for i = 1, table.getn(frameList) do
|
for i, v in ipairs(frameList) do
|
||||||
local v = frameList[i]
|
|
||||||
if frame ~= v and frame ~= v:GetParent() and not IsShiftKeyDown() and v:IsVisible() then
|
if frame ~= v and frame ~= v:GetParent() and not IsShiftKeyDown() and v:IsVisible() then
|
||||||
if self:SnapFrame(frame, v, left, top, right, bottom) then
|
if self:SnapFrame(frame, v, left, top, right, bottom) then
|
||||||
StickyFrames.sticky[frame] = v
|
StickyFrames.sticky[frame] = v
|
||||||
|
|||||||
@@ -232,8 +232,8 @@ function L_UIDropDownMenu_CreateFrames(level, index)
|
|||||||
newList:SetWidth(180)
|
newList:SetWidth(180)
|
||||||
newList:SetHeight(10)
|
newList:SetHeight(10)
|
||||||
|
|
||||||
--Allow closing with escape
|
--Allow closing with escape
|
||||||
tinsert(UIMenus, "L_DropDownList"..L_UIDROPDOWNMENU_MAXLEVELS)
|
tinsert(UIMenus, "L_DropDownList"..L_UIDROPDOWNMENU_MAXLEVELS)
|
||||||
|
|
||||||
for i=L_UIDROPDOWNMENU_MINBUTTONS+1, L_UIDROPDOWNMENU_MAXBUTTONS do
|
for i=L_UIDROPDOWNMENU_MINBUTTONS+1, L_UIDROPDOWNMENU_MAXBUTTONS do
|
||||||
local newButton = CreateFrame("Button", "L_DropDownList"..L_UIDROPDOWNMENU_MAXLEVELS.."Button"..i, newList, "L_UIDropDownMenuButtonTemplate");
|
local newButton = CreateFrame("Button", "L_DropDownList"..L_UIDROPDOWNMENU_MAXLEVELS.."Button"..i, newList, "L_UIDropDownMenuButtonTemplate");
|
||||||
@@ -292,9 +292,9 @@ function L_UIDropDownMenu_AddButton(info, level)
|
|||||||
local index = listFrame and (listFrame.numButtons + 1) or 1;
|
local index = listFrame and (listFrame.numButtons + 1) or 1;
|
||||||
local width;
|
local width;
|
||||||
|
|
||||||
--UIDropDownMenuDelegate:SetAttribute("createframes-level", level);
|
UIDropDownMenuDelegate:SetAttribute("createframes-level", level);
|
||||||
--UIDropDownMenuDelegate:SetAttribute("createframes-index", index);
|
UIDropDownMenuDelegate:SetAttribute("createframes-index", index);
|
||||||
--UIDropDownMenuDelegate:SetAttribute("createframes", true);
|
UIDropDownMenuDelegate:SetAttribute("createframes", true);
|
||||||
|
|
||||||
listFrame = listFrame or _G["L_DropDownList"..level];
|
listFrame = listFrame or _G["L_DropDownList"..level];
|
||||||
local listFrameName = listFrame:GetName();
|
local listFrameName = listFrame:GetName();
|
||||||
@@ -789,9 +789,9 @@ function L_ToggleDropDownMenu(level, value, dropDownFrame, anchorName, xOffset,
|
|||||||
level = 1;
|
level = 1;
|
||||||
end
|
end
|
||||||
|
|
||||||
--UIDropDownMenuDelegate:SetAttribute("createframes-level", level);
|
UIDropDownMenuDelegate:SetAttribute("createframes-level", level);
|
||||||
--UIDropDownMenuDelegate:SetAttribute("createframes-index", 0);
|
UIDropDownMenuDelegate:SetAttribute("createframes-index", 0);
|
||||||
--UIDropDownMenuDelegate:SetAttribute("createframes", true);
|
UIDropDownMenuDelegate:SetAttribute("createframes", true);
|
||||||
L_UIDROPDOWNMENU_MENU_LEVEL = level;
|
L_UIDROPDOWNMENU_MENU_LEVEL = level;
|
||||||
L_UIDROPDOWNMENU_MENU_VALUE = value;
|
L_UIDROPDOWNMENU_MENU_VALUE = value;
|
||||||
local listFrame = _G["L_DropDownList"..level];
|
local listFrame = _G["L_DropDownList"..level];
|
||||||
|
|||||||
@@ -139,9 +139,9 @@ local queue_quiet = {
|
|||||||
lib['WHOLIB_FLAG_ALWAYS_CALLBACK'] = 1
|
lib['WHOLIB_FLAG_ALWAYS_CALLBACK'] = 1
|
||||||
|
|
||||||
function lib:Reset()
|
function lib:Reset()
|
||||||
self.Queue = {[1]={}, [2]={}, [3]={}}
|
self.Queue = {[1]={}, [2]={}, [3]={}}
|
||||||
self.Cache = {}
|
self.Cache = {}
|
||||||
self.CacheQueue = {}
|
self.CacheQueue = {}
|
||||||
end
|
end
|
||||||
|
|
||||||
function lib.Who(defhandler, query, opts)
|
function lib.Who(defhandler, query, opts)
|
||||||
@@ -169,10 +169,10 @@ function lib.UserInfo(defhandler, name, opts)
|
|||||||
local self, args, usage = lib, {}, 'UserInfo(name, [opts])'
|
local self, args, usage = lib, {}, 'UserInfo(name, [opts])'
|
||||||
local now = time()
|
local now = time()
|
||||||
|
|
||||||
name = self:CheckArgument(usage, 'name', 'string', name)
|
name = self:CheckArgument(usage, 'name', 'string', name)
|
||||||
if strlen(name) == 0 then return end
|
if strlen(name) == 0 then return end
|
||||||
|
|
||||||
if string.find(name, "%-") then --[[dbg("ignoring xrealm: "..name)]] return end
|
if string.find(name, "%-") then --[[dbg("ignoring xrealm: "..name)]] return end
|
||||||
|
|
||||||
args.name = self:CapitalizeInitial(name)
|
args.name = self:CapitalizeInitial(name)
|
||||||
opts = self:CheckArgument(usage, 'opts', 'table', opts, {})
|
opts = self:CheckArgument(usage, 'opts', 'table', opts, {})
|
||||||
@@ -218,27 +218,27 @@ function lib.UserInfo(defhandler, name, opts)
|
|||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
if (GetLocale() == "ruRU") then -- in ruRU with n- not show information about player in WIM addon
|
if (GetLocale() == "ruRU") then -- in ruRU with n- not show information about player in WIM addon
|
||||||
if args.name and strlen(args.name) > 0 then
|
if args.name and strlen(args.name) > 0 then
|
||||||
local query = 'и-"' .. args.name .. '"'
|
local query = 'и-"' .. args.name .. '"'
|
||||||
cachedName.inqueue = true
|
cachedName.inqueue = true
|
||||||
if(args.callback ~= nil)then
|
if(args.callback ~= nil)then
|
||||||
tinsert(cachedName.callback, args)
|
tinsert(cachedName.callback, args)
|
||||||
end
|
end
|
||||||
self.CacheQueue[query] = args.name
|
self.CacheQueue[query] = args.name
|
||||||
dbg('Info(' .. args.name ..') added to queue')
|
dbg('Info(' .. args.name ..') added to queue')
|
||||||
self:AskWho( { query = query, queue = args.queue, flags = 0, info = args.name } )
|
self:AskWho( { query = query, queue = args.queue, flags = 0, info = args.name } )
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if args.name and strlen(args.name) > 0 then
|
if args.name and strlen(args.name) > 0 then
|
||||||
local query = 'n-"' .. args.name .. '"'
|
local query = 'n-"' .. args.name .. '"'
|
||||||
cachedName.inqueue = true
|
cachedName.inqueue = true
|
||||||
if(args.callback ~= nil)then
|
if(args.callback ~= nil)then
|
||||||
tinsert(cachedName.callback, args)
|
tinsert(cachedName.callback, args)
|
||||||
end
|
end
|
||||||
self.CacheQueue[query] = args.name
|
self.CacheQueue[query] = args.name
|
||||||
dbg('Info(' .. args.name ..') added to queue')
|
dbg('Info(' .. args.name ..') added to queue')
|
||||||
self:AskWho( { query = query, queue = args.queue, flags = 0, info = args.name } )
|
self:AskWho( { query = query, queue = args.queue, flags = 0, info = args.name } )
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
@@ -256,11 +256,11 @@ function lib.CachedUserInfo(_, name)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function lib.GetWhoLibDebug(_, mode)
|
function lib.GetWhoLibDebug(_, mode)
|
||||||
return lib.Debug
|
return lib.Debug
|
||||||
end
|
end
|
||||||
|
|
||||||
function lib.SetWhoLibDebug(_, mode)
|
function lib.SetWhoLibDebug(_, mode)
|
||||||
lib.Debug = mode
|
lib.Debug = mode
|
||||||
dbg = mode and dbgfunc or NOP
|
dbg = mode and dbgfunc or NOP
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -298,12 +298,12 @@ end
|
|||||||
---
|
---
|
||||||
|
|
||||||
function lib:AllQueuesEmpty()
|
function lib:AllQueuesEmpty()
|
||||||
local queueCount = getn(self.Queue[1]) + getn(self.Queue[2]) + getn(self.Queue[3]) + getn(self.CacheQueue)
|
local queueCount = getn(self.Queue[1]) + getn(self.Queue[2]) + getn(self.Queue[3]) + getn(self.CacheQueue)
|
||||||
|
|
||||||
-- Be sure that we have cleared the in-progress status
|
-- Be sure that we have cleared the in-progress status
|
||||||
if self.WhoInProgress then
|
if self.WhoInProgress then
|
||||||
queueCount = queueCount + 1
|
queueCount = queueCount + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
return queueCount == 0
|
return queueCount == 0
|
||||||
end
|
end
|
||||||
@@ -344,19 +344,19 @@ local INSTANT_QUERY_MIN_INTERVAL = 60 -- only once every 1 min
|
|||||||
function lib:UpdateWeights()
|
function lib:UpdateWeights()
|
||||||
local weightsum, sum, count = 0, 0, 0
|
local weightsum, sum, count = 0, 0, 0
|
||||||
for k,v in pairs(queue_weights) do
|
for k,v in pairs(queue_weights) do
|
||||||
sum = sum + v
|
sum = sum + v
|
||||||
weightsum = weightsum + v * getn(self.Queue[k])
|
weightsum = weightsum + v * getn(self.Queue[k])
|
||||||
end
|
end
|
||||||
|
|
||||||
if weightsum == 0 then
|
if weightsum == 0 then
|
||||||
for k,v in pairs(queue_weights) do queue_bounds[k] = v end
|
for k,v in pairs(queue_weights) do queue_bounds[k] = v end
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local adjust = sum / weightsum
|
local adjust = sum / weightsum
|
||||||
|
|
||||||
for k,v in pairs(queue_bounds) do
|
for k,v in pairs(queue_bounds) do
|
||||||
queue_bounds[k] = queue_weights[k] * adjust * getn(self.Queue[k])
|
queue_bounds[k] = queue_weights[k] * adjust * getn(self.Queue[k])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -376,17 +376,17 @@ function lib:GetNextFromScheduler()
|
|||||||
|
|
||||||
local n,i = math.random(),0
|
local n,i = math.random(),0
|
||||||
repeat
|
repeat
|
||||||
i=i+1
|
i=i+1
|
||||||
n = n - queue_bounds[i]
|
n = n - queue_bounds[i]
|
||||||
until i >= getn(self.Queue) or n <= 0
|
until i >= getn(self.Queue) or n <= 0
|
||||||
|
|
||||||
dbg(string.format("Q=%d, bound=%d", i, queue_bounds[i]))
|
dbg(string.format("Q=%d, bound=%d", i, queue_bounds[i]))
|
||||||
|
|
||||||
if getn(self.Queue[i]) > 0 then
|
if getn(self.Queue[i]) > 0 then
|
||||||
dbg(string.format("Q=%d, bound=%d", i, queue_bounds[i]))
|
dbg(string.format("Q=%d, bound=%d", i, queue_bounds[i]))
|
||||||
return i, self.Queue[i]
|
return i, self.Queue[i]
|
||||||
else
|
else
|
||||||
dbg("Queues empty, waiting")
|
dbg("Queues empty, waiting")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -424,10 +424,10 @@ function lib:AskWhoNext()
|
|||||||
self.WhoInProgress = false
|
self.WhoInProgress = false
|
||||||
|
|
||||||
local v,k,args = nil
|
local v,k,args = nil
|
||||||
local kludge = 10
|
local kludge = 10
|
||||||
repeat
|
repeat
|
||||||
k, v = self:GetNextFromScheduler()
|
k, v = self:GetNextFromScheduler()
|
||||||
if not k then break end
|
if not k then break end
|
||||||
if WhoFrame:IsShown() and k > self.WHOLIB_QUEUE_QUIET then
|
if WhoFrame:IsShown() and k > self.WHOLIB_QUEUE_QUIET then
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
@@ -435,7 +435,7 @@ function lib:AskWhoNext()
|
|||||||
args = tremove(v, 1)
|
args = tremove(v, 1)
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
kludge = kludge - 1
|
kludge = kludge - 1
|
||||||
until kludge <= 0
|
until kludge <= 0
|
||||||
|
|
||||||
if args then
|
if args then
|
||||||
@@ -453,9 +453,9 @@ function lib:AskWhoNext()
|
|||||||
self.Quiet = false
|
self.Quiet = false
|
||||||
|
|
||||||
if args.whotoui then
|
if args.whotoui then
|
||||||
-- self.hooked.SetWhoToUI(args.whotoui)
|
-- self.hooked.SetWhoToUI(args.whotoui)
|
||||||
else
|
else
|
||||||
-- self.hooked.SetWhoToUI(args.gui and true or false)
|
-- self.hooked.SetWhoToUI(args.gui and true or false)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- self.hooked.SetWhoToUI(true)
|
-- self.hooked.SetWhoToUI(true)
|
||||||
@@ -469,11 +469,11 @@ function lib:AskWhoNext()
|
|||||||
self.WhoInProgress = false
|
self.WhoInProgress = false
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Keep processing the who queue if there is more work
|
-- Keep processing the who queue if there is more work
|
||||||
if not self:AllQueuesEmpty() then
|
if not self:AllQueuesEmpty() then
|
||||||
self:AskWhoNextIn5sec()
|
self:AskWhoNextIn5sec()
|
||||||
else
|
else
|
||||||
dbg("*** Done processing requests ***")
|
dbg("*** Done processing requests ***")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -486,10 +486,10 @@ function lib:AskWho(args)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function lib:ReturnWho()
|
function lib:ReturnWho()
|
||||||
if not self.Args then
|
if not self.Args then
|
||||||
self.Quiet = nil
|
self.Quiet = nil
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if(self.Args.queue == self.WHOLIB_QUEUE_QUIET or self.Args.queue == self.WHOLIB_QUEUE_SCANNING)then
|
if(self.Args.queue == self.WHOLIB_QUEUE_QUIET or self.Args.queue == self.WHOLIB_QUEUE_SCANNING)then
|
||||||
self.Quiet = nil
|
self.Quiet = nil
|
||||||
@@ -723,7 +723,7 @@ end
|
|||||||
local MULTIBYTE_FIRST_CHAR = "^([\192-\255]?%a?[\128-\191]*)"
|
local MULTIBYTE_FIRST_CHAR = "^([\192-\255]?%a?[\128-\191]*)"
|
||||||
|
|
||||||
function lib:CapitalizeInitial(name)
|
function lib:CapitalizeInitial(name)
|
||||||
return string.gsub(name, MULTIBYTE_FIRST_CHAR, string.upper, 1)
|
return string.gsub(name, MULTIBYTE_FIRST_CHAR, string.upper, 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -736,7 +736,7 @@ lib.PossibleEvents = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function lib:TriggerEvent(...)
|
function lib:TriggerEvent(...)
|
||||||
callbacks:Fire(event, unpack(arg))
|
callbacks:Fire(event, unpack(arg))
|
||||||
end
|
end
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -761,7 +761,7 @@ SlashCmdList['WHOLIB_DEBUG'] = function()
|
|||||||
-- /wholibdebug: toggle debug on/off
|
-- /wholibdebug: toggle debug on/off
|
||||||
local self = lib
|
local self = lib
|
||||||
|
|
||||||
self:SetWhoLibDebug(not self.Debug)
|
self:SetWhoLibDebug(not self.Debug)
|
||||||
end
|
end
|
||||||
|
|
||||||
SLASH_WHOLIB_DEBUG1 = '/wholibdebug'
|
SLASH_WHOLIB_DEBUG1 = '/wholibdebug'
|
||||||
@@ -889,12 +889,12 @@ end
|
|||||||
FriendsFrame:UnregisterEvent("WHO_LIST_UPDATE")
|
FriendsFrame:UnregisterEvent("WHO_LIST_UPDATE")
|
||||||
|
|
||||||
function lib:WHO_LIST_UPDATE()
|
function lib:WHO_LIST_UPDATE()
|
||||||
if not lib.Quiet then
|
if not lib.Quiet then
|
||||||
WhoList_Update()
|
WhoList_Update()
|
||||||
FriendsFrame_Update()
|
FriendsFrame_Update()
|
||||||
end
|
end
|
||||||
|
|
||||||
lib:ProcessWhoResults()
|
lib:ProcessWhoResults()
|
||||||
end
|
end
|
||||||
|
|
||||||
function lib:ProcessWhoResults()
|
function lib:ProcessWhoResults()
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
<Include file="LibDataBroker\LibDataBroker-1.1.xml"/>
|
<Include file="LibDataBroker\LibDataBroker-1.1.xml"/>
|
||||||
<Include file="LibElvUIPlugin-1.0\LibElvUIPlugin-1.0.xml"/>
|
<Include file="LibElvUIPlugin-1.0\LibElvUIPlugin-1.0.xml"/>
|
||||||
<Include file="oUF\oUF.xml"/>
|
<Include file="oUF\oUF.xml"/>
|
||||||
|
<Include file="oUF_Plugins\oUF_Plugins.xml"/>
|
||||||
<Include file="UTF8\UTF8.xml"/>
|
<Include file="UTF8\UTF8.xml"/>
|
||||||
<Include file="LibCompress\LibCompress.xml"/>
|
<Include file="LibCompress\LibCompress.xml"/>
|
||||||
<Include file="LibBase64-1.0\LibBase64-1.0.xml"/>
|
<Include file="LibBase64-1.0\LibBase64-1.0.xml"/>
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ At least one of the above widgets must be present for the element to work.
|
|||||||
## Options
|
## Options
|
||||||
|
|
||||||
.disableMouse - Disables mouse events (boolean)
|
.disableMouse - Disables mouse events (boolean)
|
||||||
.disableCooldown - Disables the cooldown spiral (boolean)
|
|
||||||
.size - Aura icon size. Defaults to 16 (number)
|
.size - Aura icon size. Defaults to 16 (number)
|
||||||
.spacing - Spacing between each icon. Defaults to 0 (number)
|
.spacing - Spacing between each icon. Defaults to 0 (number)
|
||||||
.['spacing-x'] - Horizontal spacing between each icon. Takes priority over `spacing` (number)
|
.['spacing-x'] - Horizontal spacing between each icon. Takes priority over `spacing` (number)
|
||||||
@@ -64,18 +63,26 @@ button.isDebuff - indicates if the button holds a debuff (boolean)
|
|||||||
local ns = oUF
|
local ns = oUF
|
||||||
local oUF = ns.oUF
|
local oUF = ns.oUF
|
||||||
|
|
||||||
local tinsert = table.insert
|
local tinsert, getn = table.insert, table.getn
|
||||||
local floor = math.floor
|
local floor, min, mod = math.floor, math.min, math.mod
|
||||||
|
|
||||||
local CreateFrame = CreateFrame
|
local CreateFrame = CreateFrame
|
||||||
local GetTime = GetTime
|
local GetTime = GetTime
|
||||||
local UnitAura = UnitAura
|
local UnitAura = UnitAura
|
||||||
|
local GetPlayerBuff = GetPlayerBuff
|
||||||
|
local GetPlayerBuffTexture = GetPlayerBuffTexture
|
||||||
|
local GetPlayerBuffApplications = GetPlayerBuffApplications
|
||||||
|
local GetPlayerBuffDispelType = GetPlayerBuffDispelType
|
||||||
|
local GetPlayerBuffTimeLeft = GetPlayerBuffTimeLeft
|
||||||
|
|
||||||
local VISIBLE = 1
|
local VISIBLE = 1
|
||||||
local HIDDEN = 0
|
local HIDDEN = 0
|
||||||
|
|
||||||
local function UpdateTooltip(self)
|
local function UpdateTooltip(self)
|
||||||
if self.filter == 'HELPFUL' then
|
if self:GetParent().__owner.unit == "player" then
|
||||||
|
local index = GetPlayerBuff(self:GetID() - 1, self.filter)
|
||||||
|
GameTooltip:SetPlayerBuff(index)
|
||||||
|
elseif self.filter == 'HELPFUL' then
|
||||||
GameTooltip:SetUnitBuff(self:GetParent().__owner.unit, self:GetID(), self.filter)
|
GameTooltip:SetUnitBuff(self:GetParent().__owner.unit, self:GetID(), self.filter)
|
||||||
else
|
else
|
||||||
GameTooltip:SetUnitDebuff(self:GetParent().__owner.unit, self:GetID(), self.filter)
|
GameTooltip:SetUnitDebuff(self:GetParent().__owner.unit, self:GetID(), self.filter)
|
||||||
@@ -83,7 +90,7 @@ local function UpdateTooltip(self)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function onEnter(self)
|
local function onEnter(self)
|
||||||
if(not self:IsVisible()) then return end
|
if not self:IsVisible() then return end
|
||||||
|
|
||||||
GameTooltip:SetOwner(self, 'ANCHOR_BOTTOMRIGHT')
|
GameTooltip:SetOwner(self, 'ANCHOR_BOTTOMRIGHT')
|
||||||
self:UpdateTooltip()
|
self:UpdateTooltip()
|
||||||
@@ -97,9 +104,6 @@ local function createAuraIcon(element, index)
|
|||||||
local button = CreateFrame('Button', '$parentButton' .. index, element)
|
local button = CreateFrame('Button', '$parentButton' .. index, element)
|
||||||
button:RegisterForClicks('RightButtonUp')
|
button:RegisterForClicks('RightButtonUp')
|
||||||
|
|
||||||
local cd = CreateFrame('Cooldown', '$parentCooldown', button, 'oUF_CooldownFrameTemplate')
|
|
||||||
cd:SetAllPoints()
|
|
||||||
|
|
||||||
local icon = button:CreateTexture(nil, 'BORDER')
|
local icon = button:CreateTexture(nil, 'BORDER')
|
||||||
icon:SetAllPoints()
|
icon:SetAllPoints()
|
||||||
|
|
||||||
@@ -113,12 +117,11 @@ local function createAuraIcon(element, index)
|
|||||||
button.overlay = overlay
|
button.overlay = overlay
|
||||||
|
|
||||||
button.UpdateTooltip = UpdateTooltip
|
button.UpdateTooltip = UpdateTooltip
|
||||||
button:SetScript('OnEnter', onEnter)
|
button:SetScript('OnEnter', function() onEnter(this) end)
|
||||||
button:SetScript('OnLeave', onLeave)
|
button:SetScript('OnLeave', onLeave)
|
||||||
|
|
||||||
button.icon = icon
|
button.icon = icon
|
||||||
button.count = count
|
button.count = count
|
||||||
button.cd = cd
|
|
||||||
|
|
||||||
--[[ Callback: Auras:PostCreateIcon(button)
|
--[[ Callback: Auras:PostCreateIcon(button)
|
||||||
Called after a new aura button has been created.
|
Called after a new aura button has been created.
|
||||||
@@ -126,29 +129,39 @@ local function createAuraIcon(element, index)
|
|||||||
* self - the widget holding the aura buttons
|
* self - the widget holding the aura buttons
|
||||||
* button - the newly created aura button (Button)
|
* button - the newly created aura button (Button)
|
||||||
--]]
|
--]]
|
||||||
if(element.PostCreateIcon) then element:PostCreateIcon(button) end
|
if element.PostCreateIcon then element:PostCreateIcon(button) end
|
||||||
|
|
||||||
return button
|
return button
|
||||||
end
|
end
|
||||||
|
|
||||||
local function customFilter(element, unit, button, name)
|
local function customFilter(element, unit, button, texture)
|
||||||
if(name) then
|
if texture then return true end
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function updateIcon(element, unit, index, offset, filter, isDebuff, visible)
|
local function updateIcon(element, unit, index, offset, filter, isDebuff, visible)
|
||||||
local name, rank, texture, count, dispelType, duration, expiration = UnitAura(unit, index, filter)
|
local texture, count, dispelType, duration, expiration
|
||||||
|
|
||||||
if element.forceShow then
|
if unit == "player" then
|
||||||
name, rank, texture = GetSpellInfo(26993)
|
local idx = GetPlayerBuff(index - 1, filter)
|
||||||
count, dispelType, duration, expiration = 5, 'Magic', 0, 60
|
--if idx < 0 then return end
|
||||||
|
--index = idx
|
||||||
|
texture = GetPlayerBuffTexture(idx)
|
||||||
|
count = GetPlayerBuffApplications(idx)
|
||||||
|
dispelType = GetPlayerBuffDispelType(idx)
|
||||||
|
duration = GetPlayerBuffTimeLeft(idx)
|
||||||
|
else
|
||||||
|
texture, count, dispelType, duration, expiration = UnitAura(unit, index, filter)
|
||||||
end
|
end
|
||||||
|
|
||||||
if(name) then
|
if element.forceShow then
|
||||||
|
texture = 'Interface\\Icons\\Spell_Holy_DivineSpirit'
|
||||||
|
count, dispelType = 5, 'Magic'
|
||||||
|
end
|
||||||
|
|
||||||
|
if texture then
|
||||||
local position = visible + offset + 1
|
local position = visible + offset + 1
|
||||||
local button = element[position]
|
local button = element[position]
|
||||||
if(not button) then
|
if not button then
|
||||||
--[[ Override: Auras:CreateIcon(position)
|
--[[ Override: Auras:CreateIcon(position)
|
||||||
Used to create the aura button at a given position.
|
Used to create the aura button at a given position.
|
||||||
|
|
||||||
@@ -182,24 +195,12 @@ local function updateIcon(element, unit, index, offset, filter, isDebuff, visibl
|
|||||||
--]]
|
--]]
|
||||||
local show = true
|
local show = true
|
||||||
if not element.forceShow then
|
if not element.forceShow then
|
||||||
show = (element.CustomFilter or customFilter) (element, unit, button, name, rank, texture, count, dispelType, duration, expiration)
|
show = (element.CustomFilter or customFilter) (element, unit, button, texture, count, dispelType, duration, expiration)
|
||||||
end
|
end
|
||||||
|
|
||||||
if(show) then
|
if show then
|
||||||
-- We might want to consider delaying the creation of an actual cooldown
|
if button.overlay then
|
||||||
-- object to this point, but I think that will just make things needlessly
|
if (isDebuff and element.showDebuffType) or (not isDebuff and element.showBuffType) or element.showType then
|
||||||
-- complicated.
|
|
||||||
if(button.cd and not element.disableCooldown) then
|
|
||||||
if(duration and duration > 0) then
|
|
||||||
button.cd:SetCooldown(GetTime() - (duration - expiration), duration)
|
|
||||||
button.cd:Show()
|
|
||||||
else
|
|
||||||
button.cd:Hide()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if(button.overlay) then
|
|
||||||
if((isDebuff and element.showDebuffType) or (not isDebuff and element.showBuffType) or element.showType) then
|
|
||||||
local color = DebuffTypeColor[dispelType] or DebuffTypeColor.none
|
local color = DebuffTypeColor[dispelType] or DebuffTypeColor.none
|
||||||
|
|
||||||
button.overlay:SetVertexColor(color.r, color.g, color.b)
|
button.overlay:SetVertexColor(color.r, color.g, color.b)
|
||||||
@@ -209,11 +210,12 @@ local function updateIcon(element, unit, index, offset, filter, isDebuff, visibl
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if(button.icon) then button.icon:SetTexture(texture) end
|
if button.icon then button.icon:SetTexture(texture) end
|
||||||
if(button.count) then button.count:SetText(count > 1 and count) end
|
if button.count then button.count:SetText(count > 1 and count) end
|
||||||
|
|
||||||
local size = element.size or 16
|
local size = element.size or 16
|
||||||
button:SetSize(size, size)
|
button:SetWidth(size)
|
||||||
|
button:SetHeight(size)
|
||||||
|
|
||||||
button:EnableMouse(not element.disableMouse)
|
button:EnableMouse(not element.disableMouse)
|
||||||
button:SetID(index)
|
button:SetID(index)
|
||||||
@@ -228,7 +230,7 @@ local function updateIcon(element, unit, index, offset, filter, isDebuff, visibl
|
|||||||
* index - the index of the aura (number)
|
* index - the index of the aura (number)
|
||||||
* position - the actual position of the aura button (number)
|
* position - the actual position of the aura button (number)
|
||||||
--]]
|
--]]
|
||||||
if(element.PostUpdateIcon) then
|
if element.PostUpdateIcon then
|
||||||
element:PostUpdateIcon(unit, button, index, position)
|
element:PostUpdateIcon(unit, button, index, position)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -252,7 +254,7 @@ local function SetPosition(element, from, to)
|
|||||||
|
|
||||||
-- Bail out if the to range is out of scope.
|
-- Bail out if the to range is out of scope.
|
||||||
if(not button) then break end
|
if(not button) then break end
|
||||||
local col = (i - 1) % cols
|
local col = mod((i - 1), cols)
|
||||||
local row = floor((i - 1) / cols)
|
local row = floor((i - 1) / cols)
|
||||||
|
|
||||||
button:ClearAllPoints()
|
button:ClearAllPoints()
|
||||||
@@ -261,25 +263,25 @@ local function SetPosition(element, from, to)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function filterIcons(element, unit, filter, limit, isDebuff, offset, dontHide)
|
local function filterIcons(element, unit, filter, limit, isDebuff, offset, dontHide)
|
||||||
if(not offset) then offset = 0 end
|
if not offset then offset = 0 end
|
||||||
local index = 1
|
local index = 1
|
||||||
local visible = 0
|
local visible = 0
|
||||||
local hidden = 0
|
local hidden = 0
|
||||||
while(visible < limit) do
|
while visible < limit do
|
||||||
local result = updateIcon(element, unit, index, offset, filter, isDebuff, visible)
|
local result = updateIcon(element, unit, index, offset, filter, isDebuff, visible)
|
||||||
if(not result) then
|
if not result then
|
||||||
break
|
break
|
||||||
elseif(result == VISIBLE) then
|
elseif result == VISIBLE then
|
||||||
visible = visible + 1
|
visible = visible + 1
|
||||||
elseif(result == HIDDEN) then
|
elseif result == HIDDEN then
|
||||||
hidden = hidden + 1
|
hidden = hidden + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
index = index + 1
|
index = index + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
if(not dontHide) then
|
if not dontHide then
|
||||||
for i = visible + offset + 1, #element do
|
for i = visible + offset + 1, getn(element) do
|
||||||
element[i]:Hide()
|
element[i]:Hide()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -288,42 +290,43 @@ local function filterIcons(element, unit, filter, limit, isDebuff, offset, dontH
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function UpdateAuras(self, event, unit)
|
local function UpdateAuras(self, event, unit)
|
||||||
if(self.unit ~= unit) then return end
|
if event == "PLAYER_AURAS_CHANGED" then unit = "player" end
|
||||||
|
|
||||||
|
if self.unit ~= unit then return end
|
||||||
|
|
||||||
local auras = self.Auras
|
local auras = self.Auras
|
||||||
if(auras) then
|
if auras then
|
||||||
--[[ Callback: Auras:PreUpdate(unit)
|
--[[ Callback: Auras:PreUpdate(unit)
|
||||||
Called before the element has been updated.
|
Called before the element has been updated.
|
||||||
|
|
||||||
* self - the widget holding the aura buttons
|
* self - the widget holding the aura buttons
|
||||||
* unit - the unit for which the update has been triggered (string)
|
* unit - the unit for which the update has been triggered (string)
|
||||||
--]]
|
--]]
|
||||||
if(auras.PreUpdate) then auras:PreUpdate(unit) end
|
if auras.PreUpdate then auras:PreUpdate(unit) end
|
||||||
|
|
||||||
local numBuffs = auras.numBuffs or 32
|
local numBuffs = auras.numBuffs or 32
|
||||||
local numDebuffs = auras.numDebuffs or 40
|
local numDebuffs = auras.numDebuffs or 40
|
||||||
local max = auras.numTotal or numBuffs + numDebuffs
|
local max = auras.numTotal or numBuffs + numDebuffs
|
||||||
|
|
||||||
local visibleBuffs, hiddenBuffs = filterIcons(auras, unit, auras.buffFilter or auras.filter or 'HELPFUL', math.min(numBuffs, max), nil, 0, true)
|
local visibleBuffs, hiddenBuffs = filterIcons(auras, unit, auras.buffFilter or auras.filter or 'HELPFUL', min(numBuffs, max), nil, 0, true)
|
||||||
|
|
||||||
local hasGap
|
local hasGap
|
||||||
if(visibleBuffs ~= 0 and auras.gap) then
|
if visibleBuffs ~= 0 and auras.gap then
|
||||||
hasGap = true
|
hasGap = true
|
||||||
visibleBuffs = visibleBuffs + 1
|
visibleBuffs = visibleBuffs + 1
|
||||||
|
|
||||||
local button = auras[visibleBuffs]
|
local button = auras[visibleBuffs]
|
||||||
if(not button) then
|
if not button then
|
||||||
button = (auras.CreateIcon or createAuraIcon) (auras, visibleBuffs)
|
button = (auras.CreateIcon or createAuraIcon) (auras, visibleBuffs)
|
||||||
tinsert(auras, button)
|
tinsert(auras, button)
|
||||||
auras.createdIcons = auras.createdIcons + 1
|
auras.createdIcons = auras.createdIcons + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Prevent the button from displaying anything.
|
-- Prevent the button from displaying anything.
|
||||||
if(button.cd) then button.cd:Hide() end
|
if button.icon then button.icon:SetTexture() end
|
||||||
if(button.icon) then button.icon:SetTexture() end
|
if button.overlay then button.overlay:Hide() end
|
||||||
if(button.overlay) then button.overlay:Hide() end
|
if button.stealable then button.stealable:Hide() end
|
||||||
if(button.stealable) then button.stealable:Hide() end
|
if button.count then button.count:SetText() end
|
||||||
if(button.count) then button.count:SetText() end
|
|
||||||
|
|
||||||
button:EnableMouse(false)
|
button:EnableMouse(false)
|
||||||
button:Show()
|
button:Show()
|
||||||
@@ -341,10 +344,10 @@ local function UpdateAuras(self, event, unit)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local visibleDebuffs, hiddenDebuffs = filterIcons(auras, unit, auras.debuffFilter or auras.filter or 'HARMFUL', math.min(numDebuffs, max - visibleBuffs), true, visibleBuffs)
|
local visibleDebuffs, hiddenDebuffs = filterIcons(auras, unit, auras.debuffFilter or auras.filter or 'HARMFUL', min(numDebuffs, max - visibleBuffs), true, visibleBuffs)
|
||||||
auras.visibleDebuffs = visibleDebuffs
|
auras.visibleDebuffs = visibleDebuffs
|
||||||
|
|
||||||
if(hasGap and visibleDebuffs == 0) then
|
if hasGap and visibleDebuffs == 0 then
|
||||||
auras[visibleBuffs]:Hide()
|
auras[visibleBuffs]:Hide()
|
||||||
visibleBuffs = visibleBuffs - 1
|
visibleBuffs = visibleBuffs - 1
|
||||||
end
|
end
|
||||||
@@ -364,11 +367,11 @@ local function UpdateAuras(self, event, unit)
|
|||||||
* from - the offset of the first aura button to be (re-)anchored (number)
|
* from - the offset of the first aura button to be (re-)anchored (number)
|
||||||
* to - the offset of the last aura button to be (re-)anchored (number)
|
* to - the offset of the last aura button to be (re-)anchored (number)
|
||||||
--]]
|
--]]
|
||||||
if(auras.PreSetPosition) then
|
if auras.PreSetPosition then
|
||||||
fromRange, toRange = auras:PreSetPosition(max)
|
fromRange, toRange = auras:PreSetPosition(max)
|
||||||
end
|
end
|
||||||
|
|
||||||
if(fromRange or auras.createdIcons > auras.anchoredIcons) then
|
if fromRange or auras.createdIcons > auras.anchoredIcons then
|
||||||
--[[ Override: Auras:SetPosition(from, to)
|
--[[ Override: Auras:SetPosition(from, to)
|
||||||
Used to (re-)anchor the aura buttons.
|
Used to (re-)anchor the aura buttons.
|
||||||
Called when new aura buttons have been created or if :PreSetPosition is defined.
|
Called when new aura buttons have been created or if :PreSetPosition is defined.
|
||||||
@@ -387,72 +390,72 @@ local function UpdateAuras(self, event, unit)
|
|||||||
* self - the widget holding the aura buttons
|
* self - the widget holding the aura buttons
|
||||||
* unit - the unit for which the update has been triggered (string)
|
* unit - the unit for which the update has been triggered (string)
|
||||||
--]]
|
--]]
|
||||||
if(auras.PostUpdate) then auras:PostUpdate(unit) end
|
if auras.PostUpdate then auras:PostUpdate(unit) end
|
||||||
end
|
end
|
||||||
|
|
||||||
local buffs = self.Buffs
|
local buffs = self.Buffs
|
||||||
if(buffs) then
|
if buffs then
|
||||||
if(buffs.PreUpdate) then buffs:PreUpdate(unit) end
|
if buffs.PreUpdate then buffs:PreUpdate(unit) end
|
||||||
|
|
||||||
local numBuffs = buffs.num or 32
|
local numBuffs = buffs.num or 32
|
||||||
local visibleBuffs, hiddenBuffs = filterIcons(buffs, unit, buffs.filter or 'HELPFUL', numBuffs)
|
local visibleBuffs, hiddenBuffs = filterIcons(buffs, unit, buffs.filter or 'HELPFUL', numBuffs)
|
||||||
buffs.visibleBuffs = visibleBuffs
|
buffs.visibleBuffs = visibleBuffs
|
||||||
|
|
||||||
local fromRange, toRange
|
local fromRange, toRange
|
||||||
if(buffs.PreSetPosition) then
|
if buffs.PreSetPosition then
|
||||||
fromRange, toRange = buffs:PreSetPosition(numBuffs)
|
fromRange, toRange = buffs:PreSetPosition(numBuffs)
|
||||||
end
|
end
|
||||||
|
|
||||||
if(fromRange or buffs.createdIcons > buffs.anchoredIcons) then
|
if fromRange or buffs.createdIcons > buffs.anchoredIcons then
|
||||||
(buffs.SetPosition or SetPosition) (buffs, fromRange or buffs.anchoredIcons + 1, toRange or buffs.createdIcons)
|
(buffs.SetPosition or SetPosition) (buffs, fromRange or buffs.anchoredIcons + 1, toRange or buffs.createdIcons)
|
||||||
buffs.anchoredIcons = buffs.createdIcons
|
buffs.anchoredIcons = buffs.createdIcons
|
||||||
end
|
end
|
||||||
|
|
||||||
if(buffs.PostUpdate) then buffs:PostUpdate(unit) end
|
if buffs.PostUpdate then buffs:PostUpdate(unit) end
|
||||||
end
|
end
|
||||||
|
|
||||||
local debuffs = self.Debuffs
|
local debuffs = self.Debuffs
|
||||||
if(debuffs) then
|
if debuffs then
|
||||||
if(debuffs.PreUpdate) then debuffs:PreUpdate(unit) end
|
if debuffs.PreUpdate then debuffs:PreUpdate(unit) end
|
||||||
|
|
||||||
local numDebuffs = debuffs.num or 40
|
local numDebuffs = debuffs.num or 40
|
||||||
local visibleDebuffs, hiddenDebuffs = filterIcons(debuffs, unit, debuffs.filter or 'HARMFUL', numDebuffs, true)
|
local visibleDebuffs, hiddenDebuffs = filterIcons(debuffs, unit, debuffs.filter or 'HARMFUL', numDebuffs, true)
|
||||||
debuffs.visibleDebuffs = visibleDebuffs
|
debuffs.visibleDebuffs = visibleDebuffs
|
||||||
|
|
||||||
local fromRange, toRange
|
local fromRange, toRange
|
||||||
if(debuffs.PreSetPosition) then
|
if debuffs.PreSetPosition then
|
||||||
fromRange, toRange = debuffs:PreSetPosition(numDebuffs)
|
fromRange, toRange = debuffs:PreSetPosition(numDebuffs)
|
||||||
end
|
end
|
||||||
|
|
||||||
if(fromRange or debuffs.createdIcons > debuffs.anchoredIcons) then
|
if fromRange or debuffs.createdIcons > debuffs.anchoredIcons then
|
||||||
(debuffs.SetPosition or SetPosition) (debuffs, fromRange or debuffs.anchoredIcons + 1, toRange or debuffs.createdIcons)
|
(debuffs.SetPosition or SetPosition) (debuffs, fromRange or debuffs.anchoredIcons + 1, toRange or debuffs.createdIcons)
|
||||||
debuffs.anchoredIcons = debuffs.createdIcons
|
debuffs.anchoredIcons = debuffs.createdIcons
|
||||||
end
|
end
|
||||||
|
|
||||||
if(debuffs.PostUpdate) then debuffs:PostUpdate(unit) end
|
if debuffs.PostUpdate then debuffs:PostUpdate(unit) end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function Update(self, event, unit)
|
local function Update(self, event, unit)
|
||||||
if(self.unit ~= unit) then return end
|
if self.unit ~= unit then return end
|
||||||
|
|
||||||
UpdateAuras(self, event, unit)
|
UpdateAuras(self, event, unit)
|
||||||
|
|
||||||
-- Assume no event means someone wants to re-anchor things. This is usually
|
-- Assume no event means someone wants to re-anchor things. This is usually
|
||||||
-- done by UpdateAllElements and :ForceUpdate.
|
-- done by UpdateAllElements and :ForceUpdate.
|
||||||
if(event == 'ForceUpdate' or not event) then
|
if event == 'ForceUpdate' or not event then
|
||||||
local buffs = self.Buffs
|
local buffs = self.Buffs
|
||||||
if(buffs) then
|
if buffs then
|
||||||
(buffs.SetPosition or SetPosition) (buffs, 1, buffs.createdIcons)
|
(buffs.SetPosition or SetPosition) (buffs, 1, buffs.createdIcons)
|
||||||
end
|
end
|
||||||
|
|
||||||
local debuffs = self.Debuffs
|
local debuffs = self.Debuffs
|
||||||
if(debuffs) then
|
if debuffs then
|
||||||
(debuffs.SetPosition or SetPosition) (debuffs, 1, debuffs.createdIcons)
|
(debuffs.SetPosition or SetPosition) (debuffs, 1, debuffs.createdIcons)
|
||||||
end
|
end
|
||||||
|
|
||||||
local auras = self.Auras
|
local auras = self.Auras
|
||||||
if(auras) then
|
if auras then
|
||||||
(auras.SetPosition or SetPosition) (auras, 1, auras.createdIcons)
|
(auras.SetPosition or SetPosition) (auras, 1, auras.createdIcons)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -463,11 +466,12 @@ local function ForceUpdate(element)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function Enable(self)
|
local function Enable(self)
|
||||||
if(self.Buffs or self.Debuffs or self.Auras) then
|
if self.Buffs or self.Debuffs or self.Auras then
|
||||||
|
self:RegisterEvent('PLAYER_AURAS_CHANGED', UpdateAuras)
|
||||||
self:RegisterEvent('UNIT_AURA', UpdateAuras)
|
self:RegisterEvent('UNIT_AURA', UpdateAuras)
|
||||||
|
|
||||||
local buffs = self.Buffs
|
local buffs = self.Buffs
|
||||||
if(buffs) then
|
if buffs then
|
||||||
buffs.__owner = self
|
buffs.__owner = self
|
||||||
buffs.ForceUpdate = ForceUpdate
|
buffs.ForceUpdate = ForceUpdate
|
||||||
|
|
||||||
@@ -478,7 +482,7 @@ local function Enable(self)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local debuffs = self.Debuffs
|
local debuffs = self.Debuffs
|
||||||
if(debuffs) then
|
if debuffs then
|
||||||
debuffs.__owner = self
|
debuffs.__owner = self
|
||||||
debuffs.ForceUpdate = ForceUpdate
|
debuffs.ForceUpdate = ForceUpdate
|
||||||
|
|
||||||
@@ -489,7 +493,7 @@ local function Enable(self)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local auras = self.Auras
|
local auras = self.Auras
|
||||||
if(auras) then
|
if auras then
|
||||||
auras.__owner = self
|
auras.__owner = self
|
||||||
auras.ForceUpdate = ForceUpdate
|
auras.ForceUpdate = ForceUpdate
|
||||||
|
|
||||||
@@ -504,13 +508,14 @@ local function Enable(self)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function Disable(self)
|
local function Disable(self)
|
||||||
if(self.Buffs or self.Debuffs or self.Auras) then
|
if self.Buffs or self.Debuffs or self.Auras then
|
||||||
|
self:UnregisterEvent('PLAYER_AURAS_CHANGED', UpdateAuras)
|
||||||
self:UnregisterEvent('UNIT_AURA', UpdateAuras)
|
self:UnregisterEvent('UNIT_AURA', UpdateAuras)
|
||||||
|
|
||||||
if(self.Buffs) then self.Buffs:Hide() end
|
if self.Buffs then self.Buffs:Hide() end
|
||||||
if(self.Debuffs) then self.Debuffs:Hide() end
|
if self.Debuffs then self.Debuffs:Hide() end
|
||||||
if(self.Auras) then self.Auras:Hide() end
|
if self.Auras then self.Auras:Hide() end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
oUF:AddElement('Auras', Update, Enable, Disable)
|
oUF:AddElement('Auras', Update, Enable, Disable)
|
||||||
|
|||||||
@@ -11,9 +11,7 @@ Castbar - A `StatusBar` to represent spell cast/channel progress.
|
|||||||
## Sub-Widgets
|
## Sub-Widgets
|
||||||
|
|
||||||
.Text - A `FontString` to represent spell name.
|
.Text - A `FontString` to represent spell name.
|
||||||
.Icon - A `Texture` to represent spell icon.
|
|
||||||
.Time - A `FontString` to represent spell duration.
|
.Time - A `FontString` to represent spell duration.
|
||||||
.SafeZone - A `Texture` to represent latency.
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
@@ -52,138 +50,80 @@ A default texture will be applied to the StatusBar and Texture widgets if they d
|
|||||||
Text:SetPoint("LEFT", Castbar)
|
Text:SetPoint("LEFT", Castbar)
|
||||||
|
|
||||||
-- Add spell icon
|
-- Add spell icon
|
||||||
local Icon = Castbar:CreateTexture(nil, "OVERLAY")
|
local Icon = Castbar:CreateTexture(nil, 'OVERLAY')
|
||||||
Icon:SetSize(20, 20)
|
Icon:SetSize(20, 20)
|
||||||
Icon:SetPoint("TOPLEFT", Castbar, "TOPLEFT")
|
Icon:SetPoint('TOPLEFT', Castbar, 'TOPLEFT')
|
||||||
|
|
||||||
-- Add safezone
|
|
||||||
local SafeZone = Castbar:CreateTexture(nil, "OVERLAY")
|
|
||||||
|
|
||||||
-- Register it with oUF
|
-- Register it with oUF
|
||||||
Castbar.bg = Background
|
Castbar.bg = Background
|
||||||
Castbar.Spark = Spark
|
Castbar.Spark = Spark
|
||||||
Castbar.Time = Time
|
Castbar.Time = Time
|
||||||
Castbar.Text = Text
|
Castbar.Text = Text
|
||||||
Castbar.Icon = Icon
|
Castbar.Icon = Icon
|
||||||
Castbar.SafeZone = SafeZone
|
|
||||||
self.Castbar = Castbar
|
self.Castbar = Castbar
|
||||||
--]]
|
--]]
|
||||||
local ns = oUF
|
local ns = oUF
|
||||||
local oUF = ns.oUF
|
local oUF = ns.oUF
|
||||||
|
|
||||||
local match = string.match
|
local GetActionTexture = GetActionTexture
|
||||||
|
local GetContainerItemInfo = GetContainerItemInfo
|
||||||
local GetNetStats = GetNetStats
|
local GetSpellTexture = GetSpellTexture
|
||||||
local GetTime = GetTime
|
local GetTime = GetTime
|
||||||
local UnitCastingInfo = UnitCastingInfo
|
|
||||||
local UnitChannelInfo = UnitChannelInfo
|
|
||||||
local UnitIsUnit = UnitIsUnit
|
|
||||||
|
|
||||||
local tradeskillCastTime, tradeskillCastDuration, tradeskillCurrent, tradeskillTotal, mergeTradeskill = 0, 0, 0, 0, false
|
local iconTexture
|
||||||
|
hooksecurefunc("UseAction", function(id)
|
||||||
|
iconTexture = GetActionTexture(id)
|
||||||
|
end)
|
||||||
|
|
||||||
local function updateSafeZone(self)
|
hooksecurefunc("CastSpell", function(id, bookType)
|
||||||
local safeZone = self.SafeZone
|
iconTexture = GetSpellTexture(id, bookType)
|
||||||
local width = self:GetWidth()
|
end)
|
||||||
local _, _, ms = GetNetStats()
|
|
||||||
|
|
||||||
-- Guard against GetNetStats returning latencies of 0.
|
hooksecurefunc("UseContainerItem", function(id, index)
|
||||||
if(ms ~= 0) then
|
iconTexture = GetContainerItemInfo(id, index)
|
||||||
local safeZoneRatio = (ms / 1e3) / self.max
|
end)
|
||||||
if(safeZoneRatio > 1) then
|
|
||||||
safeZoneRatio = 1
|
|
||||||
end
|
|
||||||
safeZone:SetWidth(width * safeZoneRatio)
|
|
||||||
safeZone:Show()
|
|
||||||
else
|
|
||||||
safeZone:Hide()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function UNIT_SPELLCAST_SENT(self, event, unit, spell, rank, target)
|
local function SPELLCAST_START(self, event, name, endTime)
|
||||||
local element = self.Castbar
|
local element = self.Castbar
|
||||||
element.curTarget = (target and target ~= "") and target or nil
|
|
||||||
|
|
||||||
if element.isTradeSkill then
|
|
||||||
element.tradeSkillCastName = spell
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function UNIT_SPELLCAST_START(self, event, unit)
|
|
||||||
if(self.unit ~= unit and self.realUnit ~= unit) then return end
|
|
||||||
|
|
||||||
local element = self.Castbar
|
|
||||||
local name, _, text, texture, startTime, endTime, isTradeSkill = UnitCastingInfo(unit)
|
|
||||||
if(not name) then
|
if(not name) then
|
||||||
return element:Hide()
|
return element:Hide()
|
||||||
end
|
end
|
||||||
|
|
||||||
endTime = endTime / 1e3
|
endTime = endTime / 1000
|
||||||
startTime = startTime / 1e3
|
element.startTime = GetTime()
|
||||||
local max = endTime - startTime
|
element.duration = element.startTime
|
||||||
|
element.max = endTime
|
||||||
element.castName = name
|
|
||||||
element.duration = GetTime() - startTime
|
|
||||||
element.max = max
|
|
||||||
element.delay = 0
|
element.delay = 0
|
||||||
element.casting = true
|
element.casting = true
|
||||||
element.holdTime = 0
|
element.holdTime = 0
|
||||||
element.isTradeSkill = isTradeSkill
|
|
||||||
|
|
||||||
if(mergeTradeskill and isTradeSkill and UnitIsUnit(unit, "player")) then
|
|
||||||
element.duration = element.duration + (element.max * tradeskillCurrent)
|
|
||||||
element.max = max * tradeskillTotal
|
|
||||||
|
|
||||||
if(unit == "player") then
|
|
||||||
tradeskillCurrent = tradeskillCurrent + 1
|
|
||||||
tradeskillCastDuration = element.duration
|
|
||||||
tradeskillCastTime = max
|
|
||||||
end
|
|
||||||
|
|
||||||
element:SetValue(element.duration)
|
|
||||||
else
|
|
||||||
element:SetValue(0)
|
|
||||||
end
|
|
||||||
element:SetMinMaxValues(0, element.max)
|
element:SetMinMaxValues(0, element.max)
|
||||||
|
element:SetValue(0)
|
||||||
|
|
||||||
if(element.Text) then element.Text:SetText(text) end
|
if(element.Text) then element.Text:SetText(name) end
|
||||||
if(element.Icon) then element.Icon:SetTexture(texture) end
|
if(element.Icon) then
|
||||||
if(element.Time) then element.Time:SetText() end
|
if(not iconTexture) then iconTexture = "Interface\\Icons\\Ability_Ambush" end
|
||||||
|
element.Icon:SetTexture(iconTexture)
|
||||||
local sf = element.SafeZone
|
iconTexture = nil
|
||||||
if(sf) then
|
|
||||||
sf:ClearAllPoints()
|
|
||||||
sf:SetPoint("RIGHT")
|
|
||||||
sf:SetPoint("TOP")
|
|
||||||
sf:SetPoint("BOTTOM")
|
|
||||||
updateSafeZone(element)
|
|
||||||
end
|
end
|
||||||
|
if(element.Time) then element.Time:SetText() end
|
||||||
|
|
||||||
--[[ Callback: Castbar:PostCastStart(unit, name)
|
--[[ Callback: Castbar:PostCastStart(unit, name)
|
||||||
Called after the element has been updated upon a spell cast start.
|
Called after the element has been updated upon a spell cast start.
|
||||||
|
|
||||||
* self - the Castbar widget
|
* self - the Castbar widget
|
||||||
* unit - unit for which the update has been triggered (string)
|
|
||||||
* name - name of the spell being cast (string)
|
* name - name of the spell being cast (string)
|
||||||
--]]
|
--]]
|
||||||
if(element.PostCastStart) then
|
if(element.PostCastStart) then
|
||||||
element:PostCastStart(unit, name)
|
element:PostCastStart(name)
|
||||||
end
|
end
|
||||||
element:Show()
|
element:Show()
|
||||||
end
|
end
|
||||||
|
|
||||||
local function UNIT_SPELLCAST_FAILED(self, event, unit, spellname)
|
local function SPELLCAST_FAILED(self, event)
|
||||||
if(not self.casting) then return end
|
if(not self.casting) then return end
|
||||||
if(self.unit ~= unit and self.realUnit ~= unit) then return end
|
|
||||||
|
|
||||||
local element = self.Castbar
|
local element = self.Castbar
|
||||||
if(spellname and (element.castName ~= spellname and element.tradeSkillCastName ~= spellname)) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if(mergeTradeskill and UnitIsUnit(unit, "player")) then
|
|
||||||
mergeTradeskill = false
|
|
||||||
element.tradeSkillCastName = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
local text = element.Text
|
local text = element.Text
|
||||||
if(text) then
|
if(text) then
|
||||||
@@ -197,40 +137,14 @@ local function UNIT_SPELLCAST_FAILED(self, event, unit, spellname)
|
|||||||
Called after the element has been updated upon a failed spell cast.
|
Called after the element has been updated upon a failed spell cast.
|
||||||
|
|
||||||
* self - the Castbar widget
|
* self - the Castbar widget
|
||||||
* unit - unit for which the update has been triggered (string)
|
|
||||||
* name - name of the failed spell (string)
|
|
||||||
--]]
|
--]]
|
||||||
if(element.PostCastFailed) then
|
if(element.PostCastFailed) then
|
||||||
return element:PostCastFailed(unit, spellname)
|
return element:PostCastFailed()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function UNIT_SPELLCAST_FAILED_QUIET(self, event, unit, spellname)
|
local function SPELLCAST_INTERRUPTED(self, event)
|
||||||
if(not self.casting) then return end
|
|
||||||
if(self.unit ~= unit and self.realUnit ~= unit) then return end
|
|
||||||
|
|
||||||
local element = self.Castbar
|
local element = self.Castbar
|
||||||
if(spellname and (element.castName ~= spellname and element.tradeSkillCastName ~= spellname)) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if(mergeTradeskill and UnitIsUnit(unit, "player")) then
|
|
||||||
mergeTradeskill = false
|
|
||||||
element.tradeSkillCastName = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
element.casting = nil
|
|
||||||
element:SetValue(0)
|
|
||||||
element:Hide()
|
|
||||||
end
|
|
||||||
|
|
||||||
local function UNIT_SPELLCAST_INTERRUPTED(self, event, unit, spellname)
|
|
||||||
if(self.unit ~= unit and self.realUnit ~= unit) then return end
|
|
||||||
|
|
||||||
local element = self.Castbar
|
|
||||||
if(spellname and element.castName ~= spellname) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local text = element.Text
|
local text = element.Text
|
||||||
if(text) then
|
if(text) then
|
||||||
@@ -245,25 +159,22 @@ local function UNIT_SPELLCAST_INTERRUPTED(self, event, unit, spellname)
|
|||||||
Called after the element has been updated upon an interrupted spell cast.
|
Called after the element has been updated upon an interrupted spell cast.
|
||||||
|
|
||||||
* self - the Castbar widget
|
* self - the Castbar widget
|
||||||
* unit - unit for which the update has been triggered (string)
|
|
||||||
* name - name of the interrupted spell (string)
|
|
||||||
--]]
|
--]]
|
||||||
if(element.PostCastInterrupted) then
|
if(element.PostCastInterrupted) then
|
||||||
return element:PostCastInterrupted(unit, spellname)
|
return element:PostCastInterrupted()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function UNIT_SPELLCAST_DELAYED(self, event, unit)
|
local function SPELLCAST_DELAYED(self, event, delay)
|
||||||
if(self.unit ~= unit and self.realUnit ~= unit) then return end
|
|
||||||
|
|
||||||
local element = self.Castbar
|
local element = self.Castbar
|
||||||
local name, _, _, _, startTime = UnitCastingInfo(unit)
|
if(not delay or not element:IsShown()) then return end
|
||||||
if(not startTime or not element:IsShown()) then return end
|
|
||||||
|
|
||||||
local duration = GetTime() - (startTime / 1000)
|
delay = delay / 1000
|
||||||
|
local duration = GetTime() - (element.startTime / 1000)
|
||||||
if(duration < 0) then duration = 0 end
|
if(duration < 0) then duration = 0 end
|
||||||
|
|
||||||
element.delay = element.delay + element.duration - duration
|
element.startTime = element.startTime + delay
|
||||||
|
element.delay = delay
|
||||||
element.duration = duration
|
element.duration = duration
|
||||||
|
|
||||||
element:SetValue(duration)
|
element:SetValue(duration)
|
||||||
@@ -272,27 +183,20 @@ local function UNIT_SPELLCAST_DELAYED(self, event, unit)
|
|||||||
Called after the element has been updated when a spell cast has been delayed.
|
Called after the element has been updated when a spell cast has been delayed.
|
||||||
|
|
||||||
* self - the Castbar widget
|
* self - the Castbar widget
|
||||||
* unit - unit that the update has been triggered (string)
|
|
||||||
* name - name of the delayed spell (string)
|
|
||||||
--]]
|
--]]
|
||||||
if(element.PostCastDelayed) then
|
if(element.PostCastDelayed) then
|
||||||
return element:PostCastDelayed(unit, name)
|
return element:PostCastDelayed()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function UNIT_SPELLCAST_STOP(self, event, unit, spellname)
|
local function SPELLCAST_STOP(self, event)
|
||||||
if(self.unit ~= unit and self.realUnit ~= unit) then return end
|
|
||||||
|
|
||||||
local element = self.Castbar
|
local element = self.Castbar
|
||||||
if(spellname and (element.castName ~= spellname)) then
|
|
||||||
return
|
if(element.casting or element.channeling) then
|
||||||
|
iconTexture = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
if(mergeTradeskill and UnitIsUnit(unit, "player")) then
|
if(element:IsShown()) then
|
||||||
if(tradeskillCurrent == tradeskillTotal) then
|
|
||||||
mergeTradeskill = false
|
|
||||||
end
|
|
||||||
else
|
|
||||||
element.casting = nil
|
element.casting = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -300,34 +204,23 @@ local function UNIT_SPELLCAST_STOP(self, event, unit, spellname)
|
|||||||
Called after the element has been updated when a spell cast has finished.
|
Called after the element has been updated when a spell cast has finished.
|
||||||
|
|
||||||
* self - the Castbar widget
|
* self - the Castbar widget
|
||||||
* unit - unit for which the update has been triggered (string)
|
|
||||||
* name - name of the spell (string)
|
|
||||||
--]]
|
--]]
|
||||||
if(element.PostCastStop) then
|
if(element.PostCastStop) then
|
||||||
return element:PostCastStop(unit, spellname)
|
return element:PostCastStop()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function UNIT_SPELLCAST_CHANNEL_START(self, event, unit)
|
local function SPELLCAST_CHANNEL_START(self, event, endTime, name)
|
||||||
if(self.unit ~= unit and self.realUnit ~= unit) then return end
|
|
||||||
|
|
||||||
local element = self.Castbar
|
local element = self.Castbar
|
||||||
local name, _, _, texture, startTime, endTime = UnitChannelInfo(unit)
|
|
||||||
if(not name) then
|
if(not name) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
endTime = endTime / 1e3
|
endTime = endTime / 1000
|
||||||
startTime = startTime / 1e3
|
element.startTime = GetTime()
|
||||||
local max = (endTime - startTime)
|
element.duration = element.startTime + endTime
|
||||||
local duration = endTime - GetTime()
|
element.max = endTime
|
||||||
|
|
||||||
element.duration = duration
|
|
||||||
element.max = max
|
|
||||||
element.delay = 0
|
element.delay = 0
|
||||||
element.startTime = startTime
|
|
||||||
element.endTime = endTime
|
|
||||||
element.extraTickRatio = 0
|
|
||||||
element.channeling = true
|
element.channeling = true
|
||||||
element.holdTime = 0
|
element.holdTime = 0
|
||||||
|
|
||||||
@@ -335,71 +228,54 @@ local function UNIT_SPELLCAST_CHANNEL_START(self, event, unit)
|
|||||||
-- executed or be fully completed by the OnUpdate handler before CHANNEL_START
|
-- executed or be fully completed by the OnUpdate handler before CHANNEL_START
|
||||||
-- is called.
|
-- is called.
|
||||||
element.casting = nil
|
element.casting = nil
|
||||||
element.castName = nil
|
|
||||||
|
|
||||||
element:SetMinMaxValues(0, max)
|
element:SetMinMaxValues(0, endTime)
|
||||||
element:SetValue(duration)
|
element:SetValue(endTime)
|
||||||
|
|
||||||
if(element.Text) then element.Text:SetText(name) end
|
if(element.Text) then element.Text:SetText(name) end
|
||||||
if(element.Icon) then element.Icon:SetTexture(texture) end
|
if(element.Icon) then
|
||||||
if(element.Time) then element.Time:SetText() end
|
if(not iconTexture) then iconTexture = "Interface\\Icons\\Ability_Ambush" end
|
||||||
|
element.Icon:SetTexture(iconTexture)
|
||||||
local sf = element.SafeZone
|
iconTexture = nil
|
||||||
if(sf) then
|
|
||||||
sf:ClearAllPoints()
|
|
||||||
sf:SetPoint("LEFT")
|
|
||||||
sf:SetPoint("TOP")
|
|
||||||
sf:SetPoint("BOTTOM")
|
|
||||||
updateSafeZone(element)
|
|
||||||
end
|
end
|
||||||
|
if(element.Time) then element.Time:SetText() end
|
||||||
|
|
||||||
--[[ Callback: Castbar:PostChannelStart(unit, name)
|
--[[ Callback: Castbar:PostChannelStart(unit, name)
|
||||||
Called after the element has been updated upon a spell channel start.
|
Called after the element has been updated upon a spell channel start.
|
||||||
|
|
||||||
* self - the Castbar widget
|
* self - the Castbar widget
|
||||||
* unit - unit for which the update has been triggered (string)
|
|
||||||
* name - name of the channeled spell (string)
|
* name - name of the channeled spell (string)
|
||||||
--]]
|
--]]
|
||||||
if(element.PostChannelStart) then
|
if(element.PostChannelStart) then
|
||||||
element:PostChannelStart(unit, name)
|
element:PostChannelStart(name)
|
||||||
end
|
end
|
||||||
element:Show()
|
element:Show()
|
||||||
end
|
end
|
||||||
|
|
||||||
local function UNIT_SPELLCAST_CHANNEL_UPDATE(self, event, unit)
|
local function SPELLCAST_CHANNEL_UPDATE(self, event, delay)
|
||||||
if(self.unit ~= unit and self.realUnit ~= unit) then return end
|
|
||||||
|
|
||||||
local element = self.Castbar
|
local element = self.Castbar
|
||||||
local name, _, _, _, startTime, endTime = UnitChannelInfo(unit)
|
if(not element:IsShown()) then
|
||||||
if(not name or not element:IsShown()) then
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local duration = (endTime / 1000) - GetTime()
|
delay = delay / 1000
|
||||||
element.delay = element.delay + element.duration - duration
|
local duration = element.startTime + (element.max - GetTime()) - delay
|
||||||
|
element.delay = element.delay - duration
|
||||||
element.duration = duration
|
element.duration = duration
|
||||||
element.max = (endTime - startTime) / 1000
|
element.startTime = element.startTime - duration
|
||||||
element.startTime = startTime / 1000
|
|
||||||
element.endTime = endTime / 1000
|
|
||||||
|
|
||||||
element:SetMinMaxValues(0, element.max)
|
|
||||||
element:SetValue(duration)
|
element:SetValue(duration)
|
||||||
|
|
||||||
--[[ Callback: Castbar:PostChannelUpdate(unit, name)
|
--[[ Callback: Castbar:PostChannelUpdate(unit, name)
|
||||||
Called after the element has been updated after a channeled spell has been delayed or interrupted.
|
Called after the element has been updated after a channeled spell has been delayed or interrupted.
|
||||||
|
|
||||||
* self - the Castbar widget
|
* self - the Castbar widget
|
||||||
* unit - unit for which the update has been triggered (string)
|
|
||||||
* name - name of the channeled spell (string)
|
|
||||||
--]]
|
--]]
|
||||||
if(element.PostChannelUpdate) then
|
if(element.PostChannelUpdate) then
|
||||||
return element:PostChannelUpdate(unit, name)
|
return element:PostChannelUpdate()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function UNIT_SPELLCAST_CHANNEL_STOP(self, event, unit, spellname)
|
local function SPELLCAST_CHANNEL_STOP(self, event)
|
||||||
if(self.unit ~= unit and self.realUnit ~= unit) then return end
|
|
||||||
|
|
||||||
local element = self.Castbar
|
local element = self.Castbar
|
||||||
if(element:IsShown()) then
|
if(element:IsShown()) then
|
||||||
element.channeling = nil
|
element.channeling = nil
|
||||||
@@ -408,22 +284,20 @@ local function UNIT_SPELLCAST_CHANNEL_STOP(self, event, unit, spellname)
|
|||||||
Called after the element has been updated after a channeled spell has been completed.
|
Called after the element has been updated after a channeled spell has been completed.
|
||||||
|
|
||||||
* self - the Castbar widget
|
* self - the Castbar widget
|
||||||
* unit - unit for which the update has been triggered (string)
|
|
||||||
* name - name of the channeled spell (string)
|
|
||||||
--]]
|
--]]
|
||||||
if(element.PostChannelStop) then
|
if(element.PostChannelStop) then
|
||||||
return element:PostChannelStop(unit, spellname)
|
return element:PostChannelStop()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function onUpdate(self, elapsed)
|
local function onUpdate(self, elapsed)
|
||||||
if(self.casting) then
|
if(self.casting) then
|
||||||
local duration = self.duration + elapsed
|
local duration = GetTime() - self.startTime
|
||||||
if(duration >= self.max or (tradeskillTotal > 1 and duration >= (tradeskillCastDuration + tradeskillCastTime * 1.25))) then
|
|
||||||
|
if(duration >= self.max) then
|
||||||
self.casting = nil
|
self.casting = nil
|
||||||
self:Hide()
|
self:Hide()
|
||||||
tradeskillTotal = 0
|
|
||||||
|
|
||||||
if(self.PostCastStop) then self:PostCastStop(self.__owner.unit) end
|
if(self.PostCastStop) then self:PostCastStop(self.__owner.unit) end
|
||||||
return
|
return
|
||||||
@@ -449,10 +323,10 @@ local function onUpdate(self, elapsed)
|
|||||||
self:SetValue(duration)
|
self:SetValue(duration)
|
||||||
|
|
||||||
if(self.Spark) then
|
if(self.Spark) then
|
||||||
self.Spark:SetPoint("CENTER", self, "LEFT", (duration / self.max) * self:GetWidth(), 0)
|
self.Spark:SetPoint("CENTER", self, "LEFT", (duration / ((self.startTime + self.max) - self.startTime)) * self:GetWidth(), 0)
|
||||||
end
|
end
|
||||||
elseif(self.channeling) then
|
elseif(self.channeling) then
|
||||||
local duration = self.duration - elapsed
|
local duration = self.startTime + (self.max - GetTime())
|
||||||
|
|
||||||
if(duration <= 0) then
|
if(duration <= 0) then
|
||||||
self.channeling = nil
|
self.channeling = nil
|
||||||
@@ -489,15 +363,14 @@ local function onUpdate(self, elapsed)
|
|||||||
self.casting = nil
|
self.casting = nil
|
||||||
self.castName = nil
|
self.castName = nil
|
||||||
self.channeling = nil
|
self.channeling = nil
|
||||||
tradeskillTotal = 0
|
|
||||||
|
|
||||||
self:Hide()
|
self:Hide()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function Update(self, ...)
|
local function Update(self, ...)
|
||||||
UNIT_SPELLCAST_START(self, ...)
|
SPELLCAST_START(self, unpack(arg))
|
||||||
return UNIT_SPELLCAST_CHANNEL_START(self, ...)
|
return SPELLCAST_CHANNEL_START(self, unpack(arg))
|
||||||
end
|
end
|
||||||
|
|
||||||
local function ForceUpdate(element)
|
local function ForceUpdate(element)
|
||||||
@@ -510,30 +383,28 @@ local function Enable(self, unit)
|
|||||||
element.__owner = self
|
element.__owner = self
|
||||||
element.ForceUpdate = ForceUpdate
|
element.ForceUpdate = ForceUpdate
|
||||||
|
|
||||||
if(not (unit and match(unit, "%wtarget$"))) then
|
|
||||||
self:RegisterEvent("UNIT_SPELLCAST_START", UNIT_SPELLCAST_START)
|
|
||||||
self:RegisterEvent("UNIT_SPELLCAST_FAILED", UNIT_SPELLCAST_FAILED)
|
|
||||||
self:RegisterEvent("UNIT_SPELLCAST_STOP", UNIT_SPELLCAST_STOP)
|
|
||||||
self:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED", UNIT_SPELLCAST_INTERRUPTED)
|
|
||||||
self:RegisterEvent("UNIT_SPELLCAST_DELAYED", UNIT_SPELLCAST_DELAYED)
|
|
||||||
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START", UNIT_SPELLCAST_CHANNEL_START)
|
|
||||||
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE", UNIT_SPELLCAST_CHANNEL_UPDATE)
|
|
||||||
self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", UNIT_SPELLCAST_CHANNEL_STOP)
|
|
||||||
self:RegisterEvent("UNIT_SPELLCAST_SENT", UNIT_SPELLCAST_SENT, true)
|
|
||||||
self:RegisterEvent("UNIT_SPELLCAST_FAILED_QUIET", UNIT_SPELLCAST_FAILED_QUIET)
|
|
||||||
end
|
|
||||||
|
|
||||||
element.holdTime = 0
|
element.holdTime = 0
|
||||||
element:SetScript("OnUpdate", element.OnUpdate or onUpdate)
|
element:SetScript("OnUpdate", function()
|
||||||
|
if element.OnUpdate then
|
||||||
|
|
||||||
|
else
|
||||||
|
onUpdate(this, arg1)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
if(unit == "player") then
|
||||||
|
self:RegisterEvent("SPELLCAST_START", SPELLCAST_START)
|
||||||
|
self:RegisterEvent("SPELLCAST_STOP", SPELLCAST_STOP)
|
||||||
|
self:RegisterEvent("SPELLCAST_FAILED", SPELLCAST_FAILED)
|
||||||
|
self:RegisterEvent("SPELLCAST_INTERRUPTED", SPELLCAST_INTERRUPTED)
|
||||||
|
self:RegisterEvent("SPELLCAST_DELAYED", SPELLCAST_DELAYED)
|
||||||
|
self:RegisterEvent("SPELLCAST_CHANNEL_START", SPELLCAST_CHANNEL_START)
|
||||||
|
self:RegisterEvent("SPELLCAST_CHANNEL_UPDATE", SPELLCAST_CHANNEL_UPDATE)
|
||||||
|
self:RegisterEvent("SPELLCAST_CHANNEL_STOP", SPELLCAST_CHANNEL_STOP)
|
||||||
|
|
||||||
if(self.unit == "player") then
|
|
||||||
CastingBarFrame:UnregisterAllEvents()
|
CastingBarFrame:UnregisterAllEvents()
|
||||||
CastingBarFrame.Show = CastingBarFrame.Hide
|
CastingBarFrame.Show = CastingBarFrame.Hide
|
||||||
CastingBarFrame:Hide()
|
CastingBarFrame:Hide()
|
||||||
|
|
||||||
PetCastingBarFrame:UnregisterAllEvents()
|
|
||||||
PetCastingBarFrame.Show = PetCastingBarFrame.Hide
|
|
||||||
PetCastingBarFrame:Hide()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if(element:IsObjectType("StatusBar") and not element:GetStatusBarTexture()) then
|
if(element:IsObjectType("StatusBar") and not element:GetStatusBarTexture()) then
|
||||||
@@ -545,11 +416,6 @@ local function Enable(self, unit)
|
|||||||
spark:SetTexture([[Interface\CastingBar\UI-CastingBar-Spark]])
|
spark:SetTexture([[Interface\CastingBar\UI-CastingBar-Spark]])
|
||||||
end
|
end
|
||||||
|
|
||||||
local safeZone = element.SafeZone
|
|
||||||
if(safeZone and safeZone:IsObjectType("Texture") and not safeZone:GetTexture()) then
|
|
||||||
safeZone:SetTexture(1, 0, 0)
|
|
||||||
end
|
|
||||||
|
|
||||||
element:Hide()
|
element:Hide()
|
||||||
|
|
||||||
return true
|
return true
|
||||||
@@ -561,27 +427,17 @@ local function Disable(self)
|
|||||||
if(element) then
|
if(element) then
|
||||||
element:Hide()
|
element:Hide()
|
||||||
|
|
||||||
self:UnregisterEvent("UNIT_SPELLCAST_START", UNIT_SPELLCAST_START)
|
self:UnregisterEvent("SPELLCAST_START", SPELLCAST_START)
|
||||||
self:UnregisterEvent("UNIT_SPELLCAST_FAILED", UNIT_SPELLCAST_FAILED)
|
self:UnregisterEvent("SPELLCAST_FAILED", SPELLCAST_FAILED)
|
||||||
self:UnregisterEvent("UNIT_SPELLCAST_STOP", UNIT_SPELLCAST_STOP)
|
self:UnregisterEvent("SPELLCAST_STOP", SPELLCAST_STOP)
|
||||||
self:UnregisterEvent("UNIT_SPELLCAST_INTERRUPTED", UNIT_SPELLCAST_INTERRUPTED)
|
self:UnregisterEvent("SPELLCAST_INTERRUPTED", SPELLCAST_INTERRUPTED)
|
||||||
self:UnregisterEvent("UNIT_SPELLCAST_DELAYED", UNIT_SPELLCAST_DELAYED)
|
self:UnregisterEvent("SPELLCAST_DELAYED", SPELLCAST_DELAYED)
|
||||||
self:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_START", UNIT_SPELLCAST_CHANNEL_START)
|
self:UnregisterEvent("SPELLCAST_CHANNEL_START", SPELLCAST_CHANNEL_START)
|
||||||
self:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE", UNIT_SPELLCAST_CHANNEL_UPDATE)
|
self:UnregisterEvent("SPELLCAST_CHANNEL_UPDATE", SPELLCAST_CHANNEL_UPDATE)
|
||||||
self:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", UNIT_SPELLCAST_CHANNEL_STOP)
|
self:UnregisterEvent("SPELLCAST_CHANNEL_STOP", SPELLCAST_CHANNEL_STOP)
|
||||||
self:UnregisterEvent("UNIT_SPELLCAST_SENT", UNIT_SPELLCAST_SENT)
|
|
||||||
self:UnregisterEvent("UNIT_SPELLCAST_FAILED_QUIET", UNIT_SPELLCAST_FAILED_QUIET)
|
|
||||||
|
|
||||||
element:SetScript("OnUpdate", nil)
|
element:SetScript("OnUpdate", nil)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
hooksecurefunc("DoTradeSkill", function(_, num)
|
oUF:AddElement("Castbar", function() end, Enable, Disable)
|
||||||
tradeskillCastTime = 0
|
|
||||||
tradeskillCastDuration = 0
|
|
||||||
tradeskillCurrent = 0
|
|
||||||
tradeskillTotal = num or 1
|
|
||||||
mergeTradeskill = true
|
|
||||||
end)
|
|
||||||
|
|
||||||
oUF:AddElement("Castbar", Update, Enable, Disable)
|
|
||||||
@@ -1,21 +1,20 @@
|
|||||||
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
<Script file="power.lua"/>
|
<Script file="power.lua"/>
|
||||||
<!--<Script file="auras.lua"/>-->
|
<Script file="auras.lua"/>
|
||||||
<Script file="health.lua"/>
|
<Script file="health.lua"/>
|
||||||
<Script file="raidtargetindicator.lua"/>
|
<Script file="raidtargetindicator.lua"/>
|
||||||
<Script file="leaderindicator.lua"/>
|
<Script file="leaderindicator.lua"/>
|
||||||
<Script file="combatindicator.lua"/>
|
<Script file="combatindicator.lua"/>
|
||||||
<Script file="restingindicator.lua"/>
|
<Script file="restingindicator.lua"/>
|
||||||
<!--<Script file="pvpindicator.lua"/>-->
|
<Script file="pvpindicator.lua"/>
|
||||||
<Script file="portrait.lua"/>
|
<Script file="portrait.lua"/>
|
||||||
<!--
|
<!--
|
||||||
<Script file="range.lua"/>
|
<Script file="range.lua"/>-->
|
||||||
<Script file="castbar.lua"/>-->
|
<Script file="castbar.lua"/>
|
||||||
<Script file="tags.lua"/>
|
<Script file="tags.lua"/>
|
||||||
<Script file="masterlooterindicator.lua"/>
|
<Script file="masterlooterindicator.lua"/>
|
||||||
<Script file="assistantindicator.lua"/>
|
<Script file="assistantindicator.lua"/>
|
||||||
<!--<Script file="readycheckindicator.lua"/>
|
<!--<Script file="combopoints.lua"/>
|
||||||
<Script file="combopoints.lua"/>
|
|
||||||
<Script file="raidroleindicator.lua"/>
|
<Script file="raidroleindicator.lua"/>
|
||||||
<Script file="happinessindicator.lua"/>
|
<Script file="happinessindicator.lua"/>
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ local function Path(self, ...)
|
|||||||
* event - the event triggering the update (string)
|
* event - the event triggering the update (string)
|
||||||
* ... - the arguments accompanying the event
|
* ... - the arguments accompanying the event
|
||||||
--]]
|
--]]
|
||||||
return (self.PvPIndicator.Override or Update) (self, ...)
|
return (self.PvPIndicator.Override or Update) (self, unpack(arg))
|
||||||
end
|
end
|
||||||
|
|
||||||
local function ForceUpdate(element)
|
local function ForceUpdate(element)
|
||||||
|
|||||||
@@ -1,152 +0,0 @@
|
|||||||
--[[
|
|
||||||
# Element: Ready Check Indicator
|
|
||||||
|
|
||||||
Handles the visibility and updating of an indicator based on the unit's ready check status.
|
|
||||||
|
|
||||||
## Widget
|
|
||||||
|
|
||||||
ReadyCheckIndicator - A `Texture` representing ready check status.
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
|
|
||||||
This element updates by changing the texture.
|
|
||||||
Default textures will be applied if the layout does not provide custom ones. See Options.
|
|
||||||
|
|
||||||
## Options
|
|
||||||
|
|
||||||
.finishedTime - For how many seconds the icon should stick after a check has completed. Defaults to 10 (number).
|
|
||||||
.fadeTime - For how many seconds the icon should fade away after the stick duration has completed. Defaults to
|
|
||||||
1.5 (number).
|
|
||||||
.readyTexture - Path to an alternate texture for the ready check "ready" status.
|
|
||||||
.notReadyTexture - Path to an alternate texture for the ready check "notready" status.
|
|
||||||
.waitingTexture - Path to an alternate texture for the ready check "waiting" status.
|
|
||||||
|
|
||||||
## Attributes
|
|
||||||
|
|
||||||
.status - the unit"s ready check status (string?)["ready", "noready", "waiting"]
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
-- Position and size
|
|
||||||
local ReadyCheckIndicator = self:CreateTexture(nil, "OVERLAY")
|
|
||||||
ReadyCheckIndicator:SetSize(16, 16)
|
|
||||||
ReadyCheckIndicator:SetPoint("TOP")
|
|
||||||
|
|
||||||
-- Register with oUF
|
|
||||||
self.ReadyCheckIndicator = ReadyCheckIndicator
|
|
||||||
--]]
|
|
||||||
|
|
||||||
local ns = oUF
|
|
||||||
local oUF = ns.oUF
|
|
||||||
|
|
||||||
local sub = string.sub
|
|
||||||
|
|
||||||
local GetReadyCheckStatus = GetReadyCheckStatus
|
|
||||||
local UnitExists = UnitExists
|
|
||||||
|
|
||||||
local function OnFinished(self)
|
|
||||||
local element = self:GetParent()
|
|
||||||
element:Hide()
|
|
||||||
|
|
||||||
--[[ Callback: ReadyCheckIndicator:PostUpdateFadeOut()
|
|
||||||
Called after the element has been faded out.
|
|
||||||
|
|
||||||
* self - the ReadyCheckIndicator element
|
|
||||||
--]]
|
|
||||||
if(element.PostUpdateFadeOut) then
|
|
||||||
element:PostUpdateFadeOut()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function Update(self, event)
|
|
||||||
local element = self.ReadyCheckIndicator
|
|
||||||
|
|
||||||
--[[ Callback: ReadyCheckIndicator:PreUpdate()
|
|
||||||
Called before the element has been updated.
|
|
||||||
|
|
||||||
* self - the ReadyCheckIndicator element
|
|
||||||
--]]
|
|
||||||
if(element.PreUpdate) then
|
|
||||||
element:PreUpdate()
|
|
||||||
end
|
|
||||||
|
|
||||||
local unit = self.unit
|
|
||||||
local status = GetReadyCheckStatus(unit)
|
|
||||||
if(UnitExists(unit) and status) then
|
|
||||||
if(status == "ready") then
|
|
||||||
element:SetTexture(element.readyTexture)
|
|
||||||
elseif(status == "notready") then
|
|
||||||
element:SetTexture(element.notReadyTexture)
|
|
||||||
else
|
|
||||||
element:SetTexture(element.waitingTexture)
|
|
||||||
end
|
|
||||||
|
|
||||||
element.status = status
|
|
||||||
element:Show()
|
|
||||||
elseif(event ~= "READY_CHECK_FINISHED") then
|
|
||||||
element.status = nil
|
|
||||||
element:Hide()
|
|
||||||
end
|
|
||||||
|
|
||||||
if(event == "READY_CHECK_FINISHED") then
|
|
||||||
if(element.status == "waiting") then
|
|
||||||
element:SetTexture(element.notReadyTexture)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--[[ Callback: ReadyCheckIndicator:PostUpdate(status)
|
|
||||||
Called after the element has been updated.
|
|
||||||
|
|
||||||
* self - the ReadyCheckIndicator element
|
|
||||||
* status - the unit"s ready check status (string?)["ready", "notready", "waiting"]
|
|
||||||
--]]
|
|
||||||
if(element.PostUpdate) then
|
|
||||||
return element:PostUpdate(status)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function Path(self, ...)
|
|
||||||
--[[ Override: ReadyCheckIndicator.Override(self, event, ...)
|
|
||||||
Used to completely override the internal update function.
|
|
||||||
|
|
||||||
* self - the parent object
|
|
||||||
* event - the event triggering the update (string)
|
|
||||||
* ... - the arguments accompanying the event
|
|
||||||
--]]
|
|
||||||
return (self.ReadyCheckIndicator.Override or Update) (self, ...)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function ForceUpdate(element)
|
|
||||||
return Path(element.__owner, "ForceUpdate")
|
|
||||||
end
|
|
||||||
|
|
||||||
local function Enable(self, unit)
|
|
||||||
local element = self.ReadyCheckIndicator
|
|
||||||
if(element and (unit and (sub(unit, 1, 5) == "party" or sub(unit, 1, 4) == "raid"))) then
|
|
||||||
element.__owner = self
|
|
||||||
element.ForceUpdate = ForceUpdate
|
|
||||||
|
|
||||||
element.readyTexture = element.readyTexture or READY_CHECK_READY_TEXTURE
|
|
||||||
element.notReadyTexture = element.notReadyTexture or READY_CHECK_NOT_READY_TEXTURE
|
|
||||||
element.waitingTexture = element.waitingTexture or READY_CHECK_WAITING_TEXTURE
|
|
||||||
|
|
||||||
self:RegisterEvent("READY_CHECK", Path, true)
|
|
||||||
self:RegisterEvent("READY_CHECK_CONFIRM", Path, true)
|
|
||||||
self:RegisterEvent("READY_CHECK_FINISHED", Path, true)
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function Disable(self)
|
|
||||||
local element = self.ReadyCheckIndicator
|
|
||||||
if(element) then
|
|
||||||
element:Hide()
|
|
||||||
|
|
||||||
self:UnregisterEvent("READY_CHECK", Path)
|
|
||||||
self:UnregisterEvent("READY_CHECK_CONFIRM", Path)
|
|
||||||
self:UnregisterEvent("READY_CHECK_FINISHED", Path)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
oUF:AddElement("ReadyCheckIndicator", Path, Enable, Disable)
|
|
||||||
@@ -615,8 +615,8 @@ local function Tag(self, fs, tagstr)
|
|||||||
tinsert(self.__mousetags, fs)
|
tinsert(self.__mousetags, fs)
|
||||||
fs:SetAlpha(0)
|
fs:SetAlpha(0)
|
||||||
if not self.__HookFunc then
|
if not self.__HookFunc then
|
||||||
self:HookScript('OnEnter', OnEnter)
|
HookScript(self, 'OnEnter', function() OnEnter(this) end)
|
||||||
self:HookScript('OnLeave', OnLeave)
|
HookScript(self, 'OnLeave', function() OnLeave(this) end)
|
||||||
self.__HookFunc = true;
|
self.__HookFunc = true;
|
||||||
end
|
end
|
||||||
tagstr = string.gsub(tagstr, '%[mouseover%]', '')
|
tagstr = string.gsub(tagstr, '%[mouseover%]', '')
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
<Script file="templates.lua"/>
|
<Script file="templates.lua"/>
|
||||||
<Include file="templates.xml"/>
|
<Include file="templates.xml"/>
|
||||||
|
|
||||||
<Script file="init.lua"/>
|
<Script file="init.lua"/>
|
||||||
<Script file="private.lua"/>
|
<Script file="private.lua"/>
|
||||||
<Script file="ouf.lua"/>
|
<Script file="ouf.lua"/>
|
||||||
@@ -16,46 +16,4 @@
|
|||||||
|
|
||||||
<Cooldown name="oUF_CooldownFrameTemplate" inherits="CooldownFrameTemplate" drawEdge="true" virtual="true"/>
|
<Cooldown name="oUF_CooldownFrameTemplate" inherits="CooldownFrameTemplate" drawEdge="true" virtual="true"/>
|
||||||
|
|
||||||
<!--
|
|
||||||
Sub-object as a child of the parent unit frame:
|
|
||||||
<Button name="oUF_HeaderTargetTemplate" inherits="SecureUnitButtonTemplate" virtual="true">
|
|
||||||
<Frames>
|
|
||||||
<Button name="$parentTarget" inherits="SecureUnitButtonTemplate">
|
|
||||||
<Attributes>
|
|
||||||
<Attribute name="unitsuffix" type="string" value="target"/>
|
|
||||||
<Attribute name="useparent-unit" type="boolean" value="true"/>
|
|
||||||
</Attributes>
|
|
||||||
</Button>
|
|
||||||
</Frames>
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
Separate unit template example:
|
|
||||||
<Button name="oUF_HeaderSeparateSubOjectsTemplate" inherits="SecureUnitButtonTemplate" virtual="true">
|
|
||||||
<Attributes>
|
|
||||||
<Attribute name="oUF-onlyProcessChildren" type="boolean" value="true"/>
|
|
||||||
</Attributes>
|
|
||||||
|
|
||||||
<Frames>
|
|
||||||
<Button name="$parentUnit" inherits="SecureUnitButtonTemplate">
|
|
||||||
<Attributes>
|
|
||||||
<Attribute name="useparent-unit" type="boolean" value="true"/>
|
|
||||||
</Attributes>
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<Button name="$parentPet" inherits="SecureUnitButtonTemplate">
|
|
||||||
<Attributes>
|
|
||||||
<Attribute name="unitsuffix" type="string" value="pet"/>
|
|
||||||
<Attribute name="useparent-unit" type="boolean" value="true"/>
|
|
||||||
</Attributes>
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<Button name="$parentTarget" inherits="SecureUnitButtonTemplate">
|
|
||||||
<Attributes>
|
|
||||||
<Attribute name="unitsuffix" type="string" value="target"/>
|
|
||||||
<Attribute name="useparent-unit" type="boolean" value="true"/>
|
|
||||||
</Attributes>
|
|
||||||
</Button>
|
|
||||||
</Frames>
|
|
||||||
</Button>
|
|
||||||
-->
|
|
||||||
</Ui>
|
</Ui>
|
||||||
@@ -59,7 +59,7 @@ local function onAttributeChanged(self, name, value)
|
|||||||
if(not self.onlyProcessChildren) then
|
if(not self.onlyProcessChildren) then
|
||||||
updateActiveUnit(self, "OnAttributeChanged")
|
updateActiveUnit(self, "OnAttributeChanged")
|
||||||
end
|
end
|
||||||
--[[
|
|
||||||
if(self.unit and self.unit == value) then
|
if(self.unit and self.unit == value) then
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
@@ -67,7 +67,7 @@ local function onAttributeChanged(self, name, value)
|
|||||||
iterateChildren(self:GetChildren())
|
iterateChildren(self:GetChildren())
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
]]
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -273,8 +273,8 @@ local function togglemenu(self, unit)
|
|||||||
ToggleDropDownMenu(1, nil, secureDropdown, "cursor")
|
ToggleDropDownMenu(1, nil, secureDropdown, "cursor")
|
||||||
end
|
end
|
||||||
|
|
||||||
local function onShow()
|
local function onShow(self)
|
||||||
return this:UpdateAllElements("OnShow")
|
return self:UpdateAllElements("OnShow")
|
||||||
end
|
end
|
||||||
|
|
||||||
local function initObject(unit, style, styleFunc, header, ...)
|
local function initObject(unit, style, styleFunc, header, ...)
|
||||||
@@ -282,7 +282,7 @@ local function initObject(unit, style, styleFunc, header, ...)
|
|||||||
for i = 1, num do
|
for i = 1, num do
|
||||||
local object = arg[i]
|
local object = arg[i]
|
||||||
local objectUnit = object.guessUnit or unit
|
local objectUnit = object.guessUnit or unit
|
||||||
local suffix = match(objectUnit or unit, "%w+target")
|
local suffix = objectUnit and match(objectUnit or unit, "%w+target")
|
||||||
|
|
||||||
object.__elements = {}
|
object.__elements = {}
|
||||||
object.__registeredEvents = {}
|
object.__registeredEvents = {}
|
||||||
@@ -331,8 +331,7 @@ local function initObject(unit, style, styleFunc, header, ...)
|
|||||||
|
|
||||||
styleFunc(object, objectUnit, not header)
|
styleFunc(object, objectUnit, not header)
|
||||||
|
|
||||||
--object:SetScript("OnAttributeChanged", onAttributeChanged)
|
object:SetScript("OnShow", function() onShow(this) end)
|
||||||
object:SetScript("OnShow", onShow)
|
|
||||||
|
|
||||||
activeElements[object] = {}
|
activeElements[object] = {}
|
||||||
for element in next, elements do
|
for element in next, elements do
|
||||||
@@ -359,7 +358,6 @@ local function walkObject(object, unit)
|
|||||||
-- Check if we should leave the main frame blank.
|
-- Check if we should leave the main frame blank.
|
||||||
if(object.onlyProcessChildren) then
|
if(object.onlyProcessChildren) then
|
||||||
object.hasChildren = true
|
object.hasChildren = true
|
||||||
--object:SetScript("OnAttributeChanged", onAttributeChanged)
|
|
||||||
return initObject(unit, style, styleFunc, header, object:GetChildren())
|
return initObject(unit, style, styleFunc, header, object:GetChildren())
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -620,7 +618,7 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--[[if(visibility) then
|
if(visibility) then
|
||||||
local type, list = split(" ", visibility, 2)
|
local type, list = split(" ", visibility, 2)
|
||||||
if(list and type == "custom") then
|
if(list and type == "custom") then
|
||||||
RegisterStateDriver(header, "visibility", list)
|
RegisterStateDriver(header, "visibility", list)
|
||||||
@@ -630,7 +628,7 @@ do
|
|||||||
RegisterStateDriver(header, "visibility", condition)
|
RegisterStateDriver(header, "visibility", condition)
|
||||||
header.visibility = condition
|
header.visibility = condition
|
||||||
end
|
end
|
||||||
end]]
|
end
|
||||||
|
|
||||||
return header
|
return header
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
local pairs = pairs
|
local pairs = pairs
|
||||||
local ipairs = ipairs
|
local ipairs = ipairs
|
||||||
|
local upper = string.upper
|
||||||
|
|
||||||
local unitExistsWatchers = {}
|
local unitExistsWatchers = {}
|
||||||
local unitExistsCache = setmetatable({},{
|
local unitExistsCache = setmetatable({},{
|
||||||
@@ -94,7 +95,7 @@ end
|
|||||||
-- Given a point return the opposite point and which axes the point
|
-- Given a point return the opposite point and which axes the point
|
||||||
-- depends on.
|
-- depends on.
|
||||||
local function getRelativePointAnchor(point)
|
local function getRelativePointAnchor(point)
|
||||||
point = strupper(point)
|
point = upper(point)
|
||||||
if point == "TOP" then
|
if point == "TOP" then
|
||||||
return "BOTTOM", 0, -1
|
return "BOTTOM", 0, -1
|
||||||
elseif point == "BOTTOM" then
|
elseif point == "BOTTOM" then
|
||||||
@@ -139,7 +140,7 @@ local function fillTable(tbl, ...)
|
|||||||
for key in pairs(tbl) do
|
for key in pairs(tbl) do
|
||||||
tbl[key] = nil
|
tbl[key] = nil
|
||||||
end
|
end
|
||||||
for i = 1, getn(arg), 1 do
|
for i = 1, arg.n, 1 do
|
||||||
local key = arg[i]
|
local key = arg[i]
|
||||||
key = tonumber(key) or key
|
key = tonumber(key) or key
|
||||||
tbl[key] = true
|
tbl[key] = true
|
||||||
@@ -150,7 +151,7 @@ end
|
|||||||
-- the array portion of the table in order
|
-- the array portion of the table in order
|
||||||
local function doubleFillTable(tbl, ...)
|
local function doubleFillTable(tbl, ...)
|
||||||
fillTable(tbl, unpack(arg))
|
fillTable(tbl, unpack(arg))
|
||||||
for i = 1, getn(arg), 1 do
|
for i = 1, arg.n, 1 do
|
||||||
tbl[i] = arg[i]
|
tbl[i] = arg[i]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,391 @@
|
|||||||
|
local ns = oUF
|
||||||
|
local oUF = ns.oUF
|
||||||
|
assert(oUF, "oUF_AuraBars was unable to locate oUF install.")
|
||||||
|
|
||||||
|
local format = string.format
|
||||||
|
local floor, huge, min, mod = math.floor, math.huge, math.min, math.mod
|
||||||
|
local tsort, getn = table.sort, table.getn
|
||||||
|
local tremove = table.remove
|
||||||
|
local random = math.random
|
||||||
|
|
||||||
|
local CreateFrame = CreateFrame
|
||||||
|
local UnitAura = UnitAura
|
||||||
|
local UnitIsFriend = UnitIsFriend
|
||||||
|
|
||||||
|
local DAY, HOUR, MINUTE = 86400, 3600, 60
|
||||||
|
local function FormatTime(s)
|
||||||
|
if s < MINUTE then
|
||||||
|
return format("%.1fs", s)
|
||||||
|
elseif s < HOUR then
|
||||||
|
return format("%dm %ds", mod(s/60,60), mod(s,60))
|
||||||
|
elseif s < DAY then
|
||||||
|
return format("%dh %dm", s/(60*60), mod(s/60,60))
|
||||||
|
else
|
||||||
|
return format("%dd %dh", s/DAY, (s / HOUR) - (floor(s/DAY) * 24))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function UpdateTooltip(self)
|
||||||
|
GameTooltip:SetUnitAura(self.__unit, self:GetParent().aura.name, self:GetParent().aura.rank, self:GetParent().aura.filter)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnEnter(self)
|
||||||
|
if(not self:IsVisible()) then return end
|
||||||
|
GameTooltip:SetOwner(self, "ANCHOR_BOTTOMRIGHT")
|
||||||
|
self:UpdateTooltip()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function OnLeave(self)
|
||||||
|
GameTooltip:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SetAnchors(self)
|
||||||
|
local bars = self.bars
|
||||||
|
|
||||||
|
for index = 1, getn(bars) do
|
||||||
|
local frame = bars[index]
|
||||||
|
local anchor = frame.anchor
|
||||||
|
frame:Height(self.auraBarHeight or 20)
|
||||||
|
frame.statusBar.iconHolder:Size(frame:GetHeight())
|
||||||
|
frame:Width((self.auraBarWidth or self:GetWidth()) - (frame:GetHeight() + (self.gap or 0)))
|
||||||
|
frame:ClearAllPoints()
|
||||||
|
if self.down == true then
|
||||||
|
if self == anchor then -- Root frame so indent for icon
|
||||||
|
frame:SetPoint("TOPLEFT", anchor, "TOPLEFT", (frame:GetHeight() + (self.gap or 0) ), -1)
|
||||||
|
else
|
||||||
|
frame:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, (-self.spacing or 0))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if self == anchor then -- Root frame so indent for icon
|
||||||
|
frame:SetPoint("BOTTOMLEFT", anchor, "BOTTOMLEFT", (frame:GetHeight() + (self.gap or 0)), 1)
|
||||||
|
else
|
||||||
|
frame:SetPoint("BOTTOMLEFT", anchor, "TOPLEFT", 0, (self.spacing or 0))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function CreateAuraBar(oUF, anchor)
|
||||||
|
local auraBarParent = oUF.AuraBars
|
||||||
|
|
||||||
|
local frame = CreateFrame("Frame", nil, auraBarParent)
|
||||||
|
frame:SetHeight(auraBarParent.auraBarHeight or 20)
|
||||||
|
frame:SetWidth((auraBarParent.auraBarWidth or auraBarParent:GetWidth()) - (frame:GetHeight() + (auraBarParent.gap or 0)))
|
||||||
|
frame.anchor = anchor
|
||||||
|
|
||||||
|
-- the main bar
|
||||||
|
local statusBar = CreateFrame("StatusBar", nil, frame)
|
||||||
|
statusBar:SetStatusBarTexture(auraBarParent.auraBarTexture or [[Interface\TargetingFrame\UI-StatusBar]])
|
||||||
|
statusBar:SetAlpha(auraBarParent.fgalpha or 1)
|
||||||
|
statusBar:SetAllPoints(frame)
|
||||||
|
|
||||||
|
frame.statusBar = statusBar
|
||||||
|
|
||||||
|
if auraBarParent.down == true then
|
||||||
|
if auraBarParent == anchor then -- Root frame so indent for icon
|
||||||
|
frame:SetPoint("TOPLEFT", anchor, "TOPLEFT", (frame:GetHeight() + (auraBarParent.gap or 0) ), -1)
|
||||||
|
else
|
||||||
|
frame:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, (-auraBarParent.spacing or 0))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if auraBarParent == anchor then -- Root frame so indent for icon
|
||||||
|
frame:SetPoint("BOTTOMLEFT", anchor, "BOTTOMLEFT", (frame:GetHeight() + (auraBarParent.gap or 0)), 1)
|
||||||
|
else
|
||||||
|
frame:SetPoint("BOTTOMLEFT", anchor, "TOPLEFT", 0, (auraBarParent.spacing or 0))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local spark = statusBar:CreateTexture(nil, "OVERLAY", nil)
|
||||||
|
spark:SetTexture([[Interface\CastingBar\UI-CastingBar-Spark]])
|
||||||
|
spark:SetWidth(12)
|
||||||
|
spark:SetBlendMode("ADD")
|
||||||
|
spark:SetPoint("CENTER", statusBar:GetStatusBarTexture(), "RIGHT")
|
||||||
|
statusBar.spark = spark
|
||||||
|
|
||||||
|
statusBar.iconHolder = CreateFrame("Button", nil, statusBar)
|
||||||
|
statusBar.iconHolder:SetHeight(frame:GetHeight())
|
||||||
|
statusBar.iconHolder:SetWidth(frame:GetHeight())
|
||||||
|
statusBar.iconHolder:SetPoint("BOTTOMRIGHT", frame, "BOTTOMLEFT", -auraBarParent.gap, 0)
|
||||||
|
statusBar.iconHolder.__unit = oUF.unit
|
||||||
|
statusBar.iconHolder:SetScript("OnEnter", OnEnter)
|
||||||
|
statusBar.iconHolder:SetScript("OnLeave", OnLeave)
|
||||||
|
statusBar.iconHolder.UpdateTooltip = UpdateTooltip
|
||||||
|
|
||||||
|
statusBar.icon = statusBar.iconHolder:CreateTexture(nil, "BACKGROUND")
|
||||||
|
statusBar.icon:SetTexCoord(.07, .93, .07, .93)
|
||||||
|
statusBar.icon:SetAllPoints()
|
||||||
|
|
||||||
|
statusBar.spelltime = statusBar:CreateFontString(nil, "ARTWORK")
|
||||||
|
if auraBarParent.spellTimeObject then
|
||||||
|
statusBar.spelltime:SetFontObject(auraBarParent.spellTimeObject)
|
||||||
|
else
|
||||||
|
statusBar.spelltime:SetFont(auraBarParent.spellTimeFont or [[Fonts\FRIZQT__.TTF]], auraBarParent.spellTimeSize or 10)
|
||||||
|
end
|
||||||
|
statusBar.spelltime:SetTextColor(1, 1, 1)
|
||||||
|
statusBar.spelltime:SetJustifyH("RIGHT")
|
||||||
|
statusBar.spelltime:SetJustifyV("CENTER")
|
||||||
|
statusBar.spelltime:SetPoint("RIGHT", 0, 0)
|
||||||
|
|
||||||
|
statusBar.spellname = statusBar:CreateFontString(nil, "ARTWORK")
|
||||||
|
if auraBarParent.spellNameObject then
|
||||||
|
statusBar.spellname:SetFontObject(auraBarParent.spellNameObject)
|
||||||
|
else
|
||||||
|
statusBar.spellname:SetFont(auraBarParent.spellNameFont or [[Fonts\FRIZQT__.TTF]], auraBarParent.spellNameSize or 10)
|
||||||
|
end
|
||||||
|
statusBar.spellname:SetTextColor(1, 1, 1)
|
||||||
|
statusBar.spellname:SetJustifyH("LEFT")
|
||||||
|
statusBar.spellname:SetJustifyV("CENTER")
|
||||||
|
statusBar.spellname:SetPoint("LEFT", 0, 0)
|
||||||
|
statusBar.spellname:SetPoint("RIGHT", statusBar.spelltime, "LEFT")
|
||||||
|
|
||||||
|
if auraBarParent.PostCreateBar then
|
||||||
|
auraBarParent.PostCreateBar(frame)
|
||||||
|
end
|
||||||
|
|
||||||
|
return frame
|
||||||
|
end
|
||||||
|
|
||||||
|
local function UpdateBars(auraBars)
|
||||||
|
local bars = auraBars.bars
|
||||||
|
local timenow = GetTime()
|
||||||
|
|
||||||
|
for index = 1, getn(bars) do
|
||||||
|
local frame = bars[index]
|
||||||
|
local bar = frame.statusBar
|
||||||
|
if not frame:IsVisible() then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
if bar.aura.noTime then
|
||||||
|
bar.spelltime:SetText()
|
||||||
|
bar.spark:Hide()
|
||||||
|
else
|
||||||
|
local timeleft = bar.aura.expirationTime - timenow
|
||||||
|
bar:SetValue(timeleft)
|
||||||
|
bar.spelltime:SetText(FormatTime(timeleft))
|
||||||
|
if auraBars.spark == true then
|
||||||
|
if (auraBars.scaleTime and ((auraBars.scaleTime <= 0) or (auraBars.scaleTime > 0 and timeleft < auraBars.scaleTime))) then
|
||||||
|
bar.spark:Show()
|
||||||
|
else
|
||||||
|
bar.spark:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function DefaultFilter(self, unit, name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate)
|
||||||
|
if unitCaster == "player" and not shouldConsolidate then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local sort = function(a, b)
|
||||||
|
local compa, compb = a.noTime and huge or a.expirationTime, b.noTime and huge or b.expirationTime
|
||||||
|
return compa > compb
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Update(self, event, unit)
|
||||||
|
if self.unit ~= unit then return end
|
||||||
|
local auraBars = self.AuraBars
|
||||||
|
local helpOrHarm
|
||||||
|
local isFriend = UnitIsFriend("player", unit) == 1 and true or false
|
||||||
|
local both = false
|
||||||
|
|
||||||
|
if auraBars.friendlyAuraType and auraBars.enemyAuraType then
|
||||||
|
if isFriend then
|
||||||
|
helpOrHarm = auraBars.friendlyAuraType
|
||||||
|
else
|
||||||
|
helpOrHarm = auraBars.enemyAuraType
|
||||||
|
end
|
||||||
|
else
|
||||||
|
helpOrHarm = isFriend and "HELPFUL" or "HARMFUL"
|
||||||
|
end
|
||||||
|
|
||||||
|
if helpOrHarm == "BOTH" then
|
||||||
|
both = true
|
||||||
|
helpOrHarm = "HELPFUL"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Create a table of auras to display
|
||||||
|
local auras = {}
|
||||||
|
local lastAuraIndex = 0
|
||||||
|
local counter = 0
|
||||||
|
if auraBars.forceShow then
|
||||||
|
for index = 1, auraBars.maxBars do
|
||||||
|
local spellID = 47540
|
||||||
|
local name, rank, icon = GetSpellInfo(spellID)
|
||||||
|
local count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate = 5, "Magic", 0, 0, "player", nil, nil
|
||||||
|
lastAuraIndex = lastAuraIndex + 1
|
||||||
|
auras[lastAuraIndex] = {}
|
||||||
|
auras[lastAuraIndex].spellID = spellID
|
||||||
|
auras[lastAuraIndex].name = name
|
||||||
|
auras[lastAuraIndex].rank = rank
|
||||||
|
auras[lastAuraIndex].icon = icon
|
||||||
|
auras[lastAuraIndex].count = count
|
||||||
|
auras[lastAuraIndex].debuffType = debuffType
|
||||||
|
auras[lastAuraIndex].duration = duration
|
||||||
|
auras[lastAuraIndex].expirationTime = expirationTime
|
||||||
|
auras[lastAuraIndex].unitCaster = unitCaster
|
||||||
|
auras[lastAuraIndex].isStealable = isStealable
|
||||||
|
auras[lastAuraIndex].noTime = (duration == 0 and expirationTime == 0)
|
||||||
|
auras[lastAuraIndex].filter = helpOrHarm
|
||||||
|
auras[lastAuraIndex].shouldConsolidate = shouldConsolidate
|
||||||
|
end
|
||||||
|
else
|
||||||
|
for index = 1, 40 do
|
||||||
|
local name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID
|
||||||
|
|
||||||
|
if not both then
|
||||||
|
name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID = UnitAura(unit, index, helpOrHarm)
|
||||||
|
|
||||||
|
if not name then break end
|
||||||
|
else
|
||||||
|
name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID = UnitAura(unit, index, "HELPFUL")
|
||||||
|
|
||||||
|
if not name then
|
||||||
|
name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID = UnitAura(unit, index, "HARMFUL")
|
||||||
|
|
||||||
|
if not name then break end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if (auraBars.filter or DefaultFilter)(self, unit, name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID) then
|
||||||
|
lastAuraIndex = lastAuraIndex + 1
|
||||||
|
auras[lastAuraIndex] = {}
|
||||||
|
auras[lastAuraIndex].spellID = spellID
|
||||||
|
auras[lastAuraIndex].name = name
|
||||||
|
auras[lastAuraIndex].rank = rank
|
||||||
|
auras[lastAuraIndex].icon = icon
|
||||||
|
auras[lastAuraIndex].count = count
|
||||||
|
auras[lastAuraIndex].debuffType = debuffType
|
||||||
|
auras[lastAuraIndex].duration = duration
|
||||||
|
auras[lastAuraIndex].expirationTime = expirationTime
|
||||||
|
auras[lastAuraIndex].unitCaster = unitCaster
|
||||||
|
auras[lastAuraIndex].isStealable = isStealable
|
||||||
|
auras[lastAuraIndex].noTime = (duration == 0 and expirationTime == 0)
|
||||||
|
auras[lastAuraIndex].filter = helpOrHarm
|
||||||
|
auras[lastAuraIndex].shouldConsolidate = shouldConsolidate
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if auraBars.sort and not auraBars.forceShow then
|
||||||
|
tsort(auras, type(auraBars.sort) == "function" and auraBars.sort or sort)
|
||||||
|
end
|
||||||
|
|
||||||
|
for i=1, getn(auras) do
|
||||||
|
if i > auraBars.maxBars then
|
||||||
|
tremove(auras, i)
|
||||||
|
else
|
||||||
|
lastAuraIndex = i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Show and configure bars for buffs/debuffs.
|
||||||
|
local bars = auraBars.bars
|
||||||
|
if lastAuraIndex == 0 then
|
||||||
|
self.AuraBars:SetHeight(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
for index = 1 , lastAuraIndex do
|
||||||
|
-- if auraBars:GetWidth() == 0 then break end
|
||||||
|
local aura = auras[index]
|
||||||
|
local frame = bars[index]
|
||||||
|
|
||||||
|
if not frame then
|
||||||
|
frame = CreateAuraBar(self, index == 1 and auraBars or bars[index - 1])
|
||||||
|
bars[index] = frame
|
||||||
|
end
|
||||||
|
|
||||||
|
if index == lastAuraIndex then
|
||||||
|
if self.AuraBars.down then
|
||||||
|
self.AuraBars:SetHeight(self.AuraBars:GetTop() - frame:GetBottom())
|
||||||
|
elseif frame:GetTop() and self.AuraBars:GetBottom() then
|
||||||
|
self.AuraBars:SetHeight(frame:GetTop() - self.AuraBars:GetBottom())
|
||||||
|
else
|
||||||
|
self.AuraBars:SetHeight(20)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local bar = frame.statusBar
|
||||||
|
frame.index = index
|
||||||
|
|
||||||
|
-- Backup the details of the aura onto the bar, so the OnUpdate function can use it
|
||||||
|
bar.aura = aura
|
||||||
|
|
||||||
|
-- Configure
|
||||||
|
if bar.aura.noTime then
|
||||||
|
bar:SetMinMaxValues(0, 1)
|
||||||
|
bar:SetValue(1)
|
||||||
|
else
|
||||||
|
if auraBars.scaleTime and auraBars.scaleTime > 0 then
|
||||||
|
local maxvalue = min(auraBars.scaleTime, bar.aura.duration)
|
||||||
|
bar:SetMinMaxValues(0, auraBars.scaleTime)
|
||||||
|
bar:SetWidth(
|
||||||
|
( maxvalue / auraBars.scaleTime ) *
|
||||||
|
( ( auraBars.auraBarWidth or auraBars:GetWidth() ) -
|
||||||
|
( bar:GetHeight() + (auraBars.gap or 0) ) ) ) -- icon size + gap
|
||||||
|
else
|
||||||
|
bar:SetMinMaxValues(0, bar.aura.duration)
|
||||||
|
end
|
||||||
|
bar:SetValue(bar.aura.expirationTime - GetTime())
|
||||||
|
end
|
||||||
|
|
||||||
|
bar.icon:SetTexture(bar.aura.icon)
|
||||||
|
|
||||||
|
-- bar.spellname:SetText(bar.aura.count > 1 and format("%s [%d]", bar.aura.name, bar.aura.count) or bar.aura.name)
|
||||||
|
bar.spelltime:SetText(not bar.noTime and FormatTime(bar.aura.expirationTime-GetTime()))
|
||||||
|
|
||||||
|
-- Colour bars
|
||||||
|
local r, g, b = .2, .6, 1 -- Colour for buffs
|
||||||
|
if auraBars.buffColor then
|
||||||
|
r, g, b = unpack(auraBars.buffColor)
|
||||||
|
end
|
||||||
|
|
||||||
|
if helpOrHarm == "HARMFUL" then
|
||||||
|
local debuffType = bar.aura.debuffType and bar.aura.debuffType or "none"
|
||||||
|
|
||||||
|
r, g, b = DebuffTypeColor[debuffType].r, DebuffTypeColor[debuffType].g, DebuffTypeColor[debuffType].b
|
||||||
|
if auraBars.debuffColor then
|
||||||
|
r, g, b = unpack(auraBars.debuffColor)
|
||||||
|
else
|
||||||
|
if debuffType == "none" and auraBars.defaultDebuffColor then
|
||||||
|
r, g, b = unpack(auraBars.defaultDebuffColor)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
bar:SetStatusBarColor(r, g, b)
|
||||||
|
frame:Show()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Hide unused bars.
|
||||||
|
for index = lastAuraIndex + 1, getn(bars) do
|
||||||
|
bars[index]:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
if auraBars.PostUpdate then
|
||||||
|
auraBars:PostUpdate(event, unit)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Enable(self)
|
||||||
|
if self.AuraBars then
|
||||||
|
self:RegisterEvent("PLAYER_AURAS_CHANGED", Update)
|
||||||
|
self.AuraBars:SetHeight(1)
|
||||||
|
self.AuraBars.bars = self.AuraBars.bars or {}
|
||||||
|
self.AuraBars.SetAnchors = SetAnchors
|
||||||
|
self.AuraBars:SetScript("OnUpdate", function() UpdateBars(self.AuraBars) end)
|
||||||
|
self.AuraBars.maxBars = self.AuraBars.maxBars or 40
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function Disable(self)
|
||||||
|
local auraFrame = self.AuraBars
|
||||||
|
if auraFrame then
|
||||||
|
self:UnregisterEvent("PLAYER_AURAS_CHANGED", Update)
|
||||||
|
auraFrame:SetScript("OnUpdate", nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
oUF:AddElement("AuraBars", Update, Enable, Disable)
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
|
<Script file="oUF_AuraBars.lua"/>
|
||||||
|
</Ui>
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
local ns = oUF
|
||||||
|
local oUF = ns.oUF
|
||||||
|
assert(oUF, "oUF not loaded")
|
||||||
|
|
||||||
|
local cos, sin, sqrt2, max, atan2 = math.cos, math.sin, math.sqrt(2), math.max, math.atan2
|
||||||
|
local tinsert, tremove = table.insert, table.remove
|
||||||
|
local pi2 = 3.141592653589793 / 2
|
||||||
|
|
||||||
|
local GetPlayerMapPosition = GetPlayerMapPosition
|
||||||
|
local UnitInParty = UnitInParty
|
||||||
|
local UnitInRaid = UnitInRaid
|
||||||
|
local UnitInRange = UnitInRange
|
||||||
|
local UnitIsConnected = UnitIsConnected
|
||||||
|
local UnitIsUnit = UnitIsUnit
|
||||||
|
|
||||||
|
local _FRAMES, OnUpdateFrame = {}
|
||||||
|
|
||||||
|
local function CalculateCorner(r) return .5 + cos(r) / sqrt2, .5 + sin(r) / sqrt2 end
|
||||||
|
local function RotateTexture(texture, angle)
|
||||||
|
local LRx, LRy = CalculateCorner(angle + 0.785398163)
|
||||||
|
local LLx, LLy = CalculateCorner(angle + 2.35619449)
|
||||||
|
local ULx, ULy = CalculateCorner(angle + 3.92699082)
|
||||||
|
local URx, URy = CalculateCorner(angle - 0.785398163)
|
||||||
|
|
||||||
|
texture:SetTexCoord(ULx, ULy, LLx, LLy, URx, URy, LRx, LRy)
|
||||||
|
end
|
||||||
|
|
||||||
|
local GetAngle = function(unit1, unit2)
|
||||||
|
local x1, y1 = GetPlayerMapPosition(unit1)
|
||||||
|
if x1 <= 0 and y1 <= 0 then return nil end
|
||||||
|
local x2, y2 = GetPlayerMapPosition(unit2)
|
||||||
|
if x2 <= 0 and y2 <= 0 then return nil end
|
||||||
|
return -pi2 - GetPlayerFacing() - atan2(y2 - y1, x2 - x1)
|
||||||
|
end
|
||||||
|
|
||||||
|
local minThrottle = 0.02
|
||||||
|
local numArrows, inRange, unit, GPS
|
||||||
|
local Update = function(self, elapsed)
|
||||||
|
if self.elapsed and self.elapsed > (self.throttle or minThrottle) then
|
||||||
|
numArrows = 0
|
||||||
|
for _, object in next, _FRAMES do
|
||||||
|
if object:IsShown() then
|
||||||
|
GPS = object.GPS
|
||||||
|
unit = object.unit
|
||||||
|
if unit then
|
||||||
|
if unit and GPS.outOfRange then
|
||||||
|
inRange = CheckInteractDistance(unit, 4)
|
||||||
|
end
|
||||||
|
|
||||||
|
if not unit or not (UnitInParty(unit) or UnitInRaid(unit)) or UnitIsUnit(unit, "player") or not UnitIsConnected(unit) or (GPS.onMouseOver and (GetMouseFocus() ~= object)) or (GPS.outOfRange and inRange) then
|
||||||
|
GPS:Hide()
|
||||||
|
else
|
||||||
|
local angle = GetAngle("player", unit)
|
||||||
|
if angle == nil then
|
||||||
|
GPS:Hide()
|
||||||
|
else
|
||||||
|
GPS:Show()
|
||||||
|
RotateTexture(GPS.Texture, angle)
|
||||||
|
|
||||||
|
numArrows = numArrows + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
GPS:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self.elapsed = 0
|
||||||
|
self.throttle = max(minThrottle, 0.005 * numArrows)
|
||||||
|
else
|
||||||
|
self.elapsed = (self.elapsed or 0) + elapsed
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local Enable = function(self)
|
||||||
|
local GPS = self.GPS
|
||||||
|
if GPS then
|
||||||
|
tinsert(_FRAMES, self)
|
||||||
|
|
||||||
|
if not OnUpdateFrame then
|
||||||
|
OnUpdateFrame = CreateFrame("Frame")
|
||||||
|
OnUpdateFrame:SetScript("OnUpdate", function()
|
||||||
|
Update(this, arg1)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
OnUpdateFrame:Show()
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local Disable = function(self)
|
||||||
|
local GPS = self.GPS
|
||||||
|
if GPS then
|
||||||
|
for k, frame in next, _FRAMES do
|
||||||
|
if frame == self then
|
||||||
|
tremove(_FRAMES, k)
|
||||||
|
GPS:Hide()
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if getn(_FRAMES) == 0 and OnUpdateFrame then
|
||||||
|
OnUpdateFrame:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
oUF:AddElement("GPS", function() end, Enable, Disable)
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
|
<Script file="oUF_GPS.lua"/>
|
||||||
|
</Ui>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
|
<Include file="oUF_AuraBars\oUF_AuraBars.xml"/>
|
||||||
|
<Include file="oUF_Smooth\oUF_Smooth.xml"/>
|
||||||
|
<Include file="oUF_GPS\oUF_GPS.xml"/>
|
||||||
|
</Ui>
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
local ns = oUF
|
||||||
|
local oUF = ns.oUF
|
||||||
|
assert(oUF, "<name> was unable to locate oUF install.")
|
||||||
|
|
||||||
|
local smoothing = {}
|
||||||
|
local function Smooth(self, value)
|
||||||
|
local _, max = self:GetMinMaxValues()
|
||||||
|
if value == self:GetValue() or (self._max and self._max ~= max) then
|
||||||
|
smoothing[self] = nil
|
||||||
|
self:SetValue_(value)
|
||||||
|
else
|
||||||
|
smoothing[self] = value
|
||||||
|
end
|
||||||
|
self._max = max
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SmoothBar(bar)
|
||||||
|
if not bar.SetValue_ then
|
||||||
|
bar.SetValue_ = bar.SetValue;
|
||||||
|
bar.SetValue = Smooth;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function hook(frame)
|
||||||
|
if frame.Health then
|
||||||
|
SmoothBar(frame.Health)
|
||||||
|
end
|
||||||
|
if frame.Power then
|
||||||
|
SmoothBar(frame.Power)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for i, frame in ipairs(oUF.objects) do hook(frame) end
|
||||||
|
oUF:RegisterInitCallback(hook)
|
||||||
|
|
||||||
|
local f, min, max = CreateFrame("Frame"), math.min, math.max
|
||||||
|
f:SetScript("OnUpdate", function()
|
||||||
|
local limit = 30/GetFramerate()
|
||||||
|
for bar, value in pairs(smoothing) do
|
||||||
|
local cur = bar:GetValue()
|
||||||
|
local new = cur + min((value-cur)/(bar.SmoothSpeed or 3), max(value-cur, limit))
|
||||||
|
if new ~= new then
|
||||||
|
-- Mad hax to prevent QNAN.
|
||||||
|
new = value
|
||||||
|
end
|
||||||
|
bar:SetValue_(new)
|
||||||
|
if (cur == value or abs(new - value) < 2) and bar.Smooth then
|
||||||
|
bar:SetValue_(value)
|
||||||
|
smoothing[bar] = nil
|
||||||
|
elseif not bar.Smooth then
|
||||||
|
bar:SetValue_(value)
|
||||||
|
smoothing[bar] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
|
<Script file="oUF_Smooth.lua"/>
|
||||||
|
</Ui>
|
||||||
@@ -12,6 +12,8 @@ local mod = math.mod
|
|||||||
local CreateFrame = CreateFrame
|
local CreateFrame = CreateFrame
|
||||||
local UIFrameFadeIn = UIFrameFadeIn
|
local UIFrameFadeIn = UIFrameFadeIn
|
||||||
local UIFrameFadeOut = UIFrameFadeOut
|
local UIFrameFadeOut = UIFrameFadeOut
|
||||||
|
local GetNumShapeshiftForms = GetNumShapeshiftForms
|
||||||
|
local GetShapeshiftFormInfo = GetShapeshiftFormInfo
|
||||||
|
|
||||||
E.ActionBars = AB
|
E.ActionBars = AB
|
||||||
|
|
||||||
@@ -468,6 +470,25 @@ function AB:ActionButton_GetPagedID(button)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function IsInShapeshiftForm()
|
||||||
|
for i = 1, GetNumShapeshiftForms() do
|
||||||
|
local _, _, active = GetShapeshiftFormInfo(i)
|
||||||
|
if active ~= nil then return true end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function AB:UNIT_PORTRAIT_UPDATE()
|
||||||
|
if arg1 == "player" and E.myclass == "DRUID" then
|
||||||
|
local inForm = IsInShapeshiftForm()
|
||||||
|
if inForm then
|
||||||
|
BonusActionBarFrame:Show()
|
||||||
|
else
|
||||||
|
BonusActionBarFrame:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function AB:Initialize()
|
function AB:Initialize()
|
||||||
self.db = E.db.actionbar
|
self.db = E.db.actionbar
|
||||||
|
|
||||||
@@ -490,8 +511,9 @@ function AB:Initialize()
|
|||||||
self:SecureHook("ActionButton_Update")
|
self:SecureHook("ActionButton_Update")
|
||||||
self:RawHook("ActionButton_GetPagedID")
|
self:RawHook("ActionButton_GetPagedID")
|
||||||
self:SecureHook("PetActionBar_Update", "UpdatePet")
|
self:SecureHook("PetActionBar_Update", "UpdatePet")
|
||||||
|
self:RegisterEvent("UNIT_PORTRAIT_UPDATE")
|
||||||
|
|
||||||
if E.myclass == "WARRIOR" then
|
if E.myclass == "WARRIOR" or (E.myclass == "DRUID" and IsInShapeshiftForm()) then
|
||||||
BonusActionBarFrame:Show()
|
BonusActionBarFrame:Show()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ local bind = CreateFrame("Frame", "ElvUI_KeyBinder", E.UIParent)
|
|||||||
|
|
||||||
function AB:ActivateBindMode()
|
function AB:ActivateBindMode()
|
||||||
bind.active = true
|
bind.active = true
|
||||||
E:StaticPopupSpecial_Show(ElvUIBindPopupWindow)
|
E:StaticPopupSpecial_Show(ElvUIBindPopupWindow)
|
||||||
AB:RegisterEvent("PLAYER_REGEN_DISABLED", "DeactivateBindMode", false)
|
AB:RegisterEvent("PLAYER_REGEN_DISABLED", "DeactivateBindMode", false)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -265,7 +265,7 @@ function AB:LoadKeyBinder()
|
|||||||
|
|
||||||
for b, _ in pairs(self["handledButtons"]) do
|
for b, _ in pairs(self["handledButtons"]) do
|
||||||
self:RegisterButton(b, true)
|
self:RegisterButton(b, true)
|
||||||
end
|
end
|
||||||
|
|
||||||
if not IsAddOnLoaded("Blizzard_MacroUI") then
|
if not IsAddOnLoaded("Blizzard_MacroUI") then
|
||||||
self:SecureHook("LoadAddOn", "RegisterMacro")
|
self:SecureHook("LoadAddOn", "RegisterMacro")
|
||||||
@@ -282,11 +282,11 @@ function AB:LoadKeyBinder()
|
|||||||
f:SetFrameLevel(99)
|
f:SetFrameLevel(99)
|
||||||
f:SetClampedToScreen(true)
|
f:SetClampedToScreen(true)
|
||||||
E:Size(f, 360, 130)
|
E:Size(f, 360, 130)
|
||||||
E:SetTemplate(f, "Transparent")
|
E:SetTemplate(f, "Transparent")
|
||||||
f:Hide()
|
f:Hide()
|
||||||
|
|
||||||
local header = CreateFrame("Button", nil, f)
|
local header = CreateFrame("Button", nil, f)
|
||||||
E:SetTemplate(header, "Default", true)
|
E:SetTemplate(header, "Default", true)
|
||||||
E:Size(header, 100, 25)
|
E:Size(header, 100, 25)
|
||||||
E:Point(header, "CENTER", f, "TOP")
|
E:Point(header, "CENTER", f, "TOP")
|
||||||
header:SetFrameLevel(header:GetFrameLevel() + 2)
|
header:SetFrameLevel(header:GetFrameLevel() + 2)
|
||||||
@@ -295,8 +295,8 @@ function AB:LoadKeyBinder()
|
|||||||
header:SetScript("OnMouseDown", function() f:StartMoving() end)
|
header:SetScript("OnMouseDown", function() f:StartMoving() end)
|
||||||
header:SetScript("OnMouseUp", function() f:StopMovingOrSizing() end)
|
header:SetScript("OnMouseUp", function() f:StopMovingOrSizing() end)
|
||||||
|
|
||||||
local title = header:CreateFontString("OVERLAY")
|
local title = header:CreateFontString("OVERLAY")
|
||||||
E:FontTemplate(title)
|
E:FontTemplate(title)
|
||||||
E:Point(title, "CENTER", header, "CENTER")
|
E:Point(title, "CENTER", header, "CENTER")
|
||||||
title:SetText("Key Binds")
|
title:SetText("Key Binds")
|
||||||
|
|
||||||
@@ -311,8 +311,8 @@ function AB:LoadKeyBinder()
|
|||||||
local perCharCheck = CreateFrame("CheckButton", f:GetName().."CheckButton", f, "OptionsCheckButtonTemplate")
|
local perCharCheck = CreateFrame("CheckButton", f:GetName().."CheckButton", f, "OptionsCheckButtonTemplate")
|
||||||
_G[perCharCheck:GetName() .. "Text"]:SetText(CHARACTER_SPECIFIC_KEYBINDINGS)
|
_G[perCharCheck:GetName() .. "Text"]:SetText(CHARACTER_SPECIFIC_KEYBINDINGS)
|
||||||
|
|
||||||
perCharCheck:SetScript("OnShow", function()
|
perCharCheck:SetScript("OnShow", function()
|
||||||
perCharCheck:SetChecked(GetCurrentBindingSet() == 2)
|
perCharCheck:SetChecked(GetCurrentBindingSet() == 2)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
perCharCheck:SetScript("OnClick", function()
|
perCharCheck:SetScript("OnClick", function()
|
||||||
|
|||||||
@@ -12,13 +12,15 @@ local format = string.format
|
|||||||
local wipe, tinsert, tsort, tremove = table.wipe, table.insert, table.sort, table.remove
|
local wipe, tinsert, tsort, tremove = table.wipe, table.insert, table.sort, table.remove
|
||||||
--WoW API / Variables
|
--WoW API / Variables
|
||||||
local CreateFrame = CreateFrame
|
local CreateFrame = CreateFrame
|
||||||
local UnitAura = UnitAura
|
|
||||||
local CancelItemTempEnchantment = CancelItemTempEnchantment
|
|
||||||
local CancelUnitBuff = CancelUnitBuff
|
|
||||||
local GetInventoryItemQuality = GetInventoryItemQuality
|
local GetInventoryItemQuality = GetInventoryItemQuality
|
||||||
local GetItemQualityColor = GetItemQualityColor
|
local GetItemQualityColor = GetItemQualityColor
|
||||||
local GetWeaponEnchantInfo = GetWeaponEnchantInfo
|
local GetWeaponEnchantInfo = GetWeaponEnchantInfo
|
||||||
local GetInventoryItemTexture = GetInventoryItemTexture
|
local GetInventoryItemTexture = GetInventoryItemTexture
|
||||||
|
local GetPlayerBuff = GetPlayerBuff
|
||||||
|
local GetPlayerBuffTexture = GetPlayerBuffTexture
|
||||||
|
local GetPlayerBuffApplications = GetPlayerBuffApplications
|
||||||
|
local GetPlayerBuffDispelType = GetPlayerBuffDispelType
|
||||||
|
local GetPlayerBuffTimeLeft = GetPlayerBuffTimeLeft
|
||||||
|
|
||||||
local DIRECTION_TO_POINT = {
|
local DIRECTION_TO_POINT = {
|
||||||
DOWN_RIGHT = "TOPLEFT",
|
DOWN_RIGHT = "TOPLEFT",
|
||||||
@@ -96,20 +98,20 @@ local function UpdateTooltip()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function OnEnter()
|
local function OnEnter(self)
|
||||||
if not this:IsVisible() then return end
|
if not self:IsVisible() then return end
|
||||||
|
|
||||||
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMLEFT", -5, -5)
|
GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT", -5, -5)
|
||||||
this:UpdateTooltip()
|
self:UpdateTooltip()
|
||||||
end
|
end
|
||||||
|
|
||||||
local function OnLeave()
|
local function OnLeave()
|
||||||
GameTooltip:Hide()
|
GameTooltip:Hide()
|
||||||
end
|
end
|
||||||
|
|
||||||
local function OnClick()
|
local function OnClick(self)
|
||||||
if this.index and this.index > 0 then
|
if self.index and self.index >= 0 then
|
||||||
CancelPlayerBuff(this.index)
|
CancelPlayerBuff(self.index)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -134,9 +136,9 @@ function A:CreateIcon(button)
|
|||||||
E:SetInside(button.highlight)
|
E:SetInside(button.highlight)
|
||||||
|
|
||||||
button.UpdateTooltip = UpdateTooltip
|
button.UpdateTooltip = UpdateTooltip
|
||||||
button:SetScript("OnEnter", OnEnter)
|
button:SetScript("OnEnter", function() OnEnter(this) end)
|
||||||
button:SetScript("OnLeave", OnLeave)
|
button:SetScript("OnLeave", function() OnLeave() end)
|
||||||
button:SetScript("OnClick", OnClick)
|
button:SetScript("OnClick", function() OnClick(this) end)
|
||||||
|
|
||||||
E:SetTemplate(button, "Default")
|
E:SetTemplate(button, "Default")
|
||||||
end
|
end
|
||||||
@@ -412,16 +414,18 @@ function A:UpdateHeader(header)
|
|||||||
weaponPosition = 1
|
weaponPosition = 1
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 0, 23 do
|
local i, aura, buffIndex, icon = 0
|
||||||
local aura, _ = freshTable()
|
while true do
|
||||||
aura.index, aura.untilCancelled = GetPlayerBuff(i, filter)
|
buffIndex = GetPlayerBuff(i, filter)
|
||||||
if aura.index < 0 then
|
icon = GetPlayerBuffTexture(buffIndex)
|
||||||
releaseTable(aura)
|
if not icon then break end
|
||||||
else
|
aura = freshTable()
|
||||||
aura.icon, aura.count, aura.dispelType, aura.expires = GetPlayerBuffTexture(aura.index), GetPlayerBuffApplications(aura.index), GetPlayerBuffDispelType(aura.index), GetPlayerBuffTimeLeft(aura.index)
|
aura.count, aura.dispelType, aura.expires = GetPlayerBuffApplications(buffIndex), GetPlayerBuffDispelType(buffIndex), GetPlayerBuffTimeLeft(buffIndex)
|
||||||
aura.filter = filter
|
aura.icon = icon
|
||||||
sortingTable[i+1] = aura
|
aura.index = buffIndex
|
||||||
end
|
aura.filter = filter
|
||||||
|
tinsert(sortingTable, aura)
|
||||||
|
i = i + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
local sortMethod = (sorters[db.sortMethod] or sorters["INDEX"])[db.sortDir == "-"][db.seperateOwn]
|
local sortMethod = (sorters[db.sortMethod] or sorters["INDEX"])[db.sortDir == "-"][db.seperateOwn]
|
||||||
@@ -429,7 +433,7 @@ function A:UpdateHeader(header)
|
|||||||
|
|
||||||
self:ConfigureAuras(header, sortingTable, weaponPosition)
|
self:ConfigureAuras(header, sortingTable, weaponPosition)
|
||||||
while sortingTable[1] do
|
while sortingTable[1] do
|
||||||
releaseTable(wipe(sortingTable))
|
releaseTable(tremove(sortingTable))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
+28
-25
@@ -152,15 +152,8 @@ local function UpdateLocation(from, to)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function PrimarySort(a, b)
|
local function PrimarySort(a, b)
|
||||||
local aName, _, _, aLvl, _, _, _, _, _, _, aPrice = GetItemInfo(bagIDs[a])
|
local aName = GetItemInfo(bagIDs[a])
|
||||||
local bName, _, _, bLvl, _, _, _, _, _, _, bPrice = GetItemInfo(bagIDs[b])
|
local bName = GetItemInfo(bagIDs[b])
|
||||||
|
|
||||||
if aLvl ~= bLvl and aLvl and bLvl then
|
|
||||||
return aLvl > bLvl
|
|
||||||
end
|
|
||||||
if aPrice ~= bPrice and aPrice and bPrice then
|
|
||||||
return aPrice > bPrice
|
|
||||||
end
|
|
||||||
|
|
||||||
if aName and bName then
|
if aName and bName then
|
||||||
return aName < bName
|
return aName < bName
|
||||||
@@ -185,8 +178,8 @@ local function DefaultSort(a, b)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local _, _, aRarity, _, _, aType, aSubType, _, aEquipLoc = GetItemInfo(aID)
|
local _, _, aRarity, _, aType, aSubType, _, aEquipLoc = GetItemInfo(aID)
|
||||||
local _, _, bRarity, _, _, bType, bSubType, _, bEquipLoc = GetItemInfo(bID)
|
local _, _, bRarity, _, bType, bSubType, _, bEquipLoc = GetItemInfo(bID)
|
||||||
|
|
||||||
aRarity = bagQualities[a]
|
aRarity = bagQualities[a]
|
||||||
bRarity = bagQualities[b]
|
bRarity = bagQualities[b]
|
||||||
@@ -368,19 +361,29 @@ function B:ScanBags()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- TEMPORARY MAYBE UNTIL ALTERNATIVE FIX
|
local bagType = {
|
||||||
function B:GetItemFamily(bagType)
|
["Bag"] = 0,
|
||||||
local itemSubType = select(6, GetItemInfo(match(bagType, "item:(%d+)")))
|
["Quiver"] = 1,
|
||||||
|
["Ammo Pouch"] = 2,
|
||||||
|
["Soul Bag"] = 4,
|
||||||
|
}
|
||||||
|
|
||||||
if strupper(itemSubType) == "BAG" then
|
function B:GetItemFamily(bagID)
|
||||||
return 0
|
if bagID == KEYRING_CONTAINER then return KEYRING_CONTAINER end
|
||||||
elseif strupper(itemSubType) == "QUIVER" then
|
if bagID == 0 then return 0 end
|
||||||
return 1
|
|
||||||
elseif strupper(itemSubType) == "KEYRING" then
|
local _, _, id = strfind(GetInventoryItemLink("player", ContainerIDToInventoryID(bagID)) or "", "item:(%d+)")
|
||||||
return -2
|
if id then
|
||||||
else
|
local _, _, _, _, itemType, subType = GetItemInfo(id)
|
||||||
return nil
|
local bagSubType = bagType[subType]
|
||||||
|
|
||||||
|
if bagSubType == 0 then return 0 end -- based off https://wow.gamepedia.com/ItemFamily
|
||||||
|
if bagSubType == 1 then return 1 end
|
||||||
|
if bagSubType == 2 then return 2 end
|
||||||
|
if bagSubType == 4 then return 4 end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
function B:IsSpecialtyBag(bagID)
|
function B:IsSpecialtyBag(bagID)
|
||||||
@@ -392,8 +395,8 @@ function B:IsSpecialtyBag(bagID)
|
|||||||
local bag = GetInventoryItemLink("player", inventorySlot)
|
local bag = GetInventoryItemLink("player", inventorySlot)
|
||||||
if not bag then return false end
|
if not bag then return false end
|
||||||
|
|
||||||
local family = B:GetItemFamily(bag)
|
local family = B:GetItemFamily(bagID)
|
||||||
if family == 0 or family == nil then return false end
|
if family == 0 or family == nil then return false else return false end
|
||||||
|
|
||||||
return family
|
return family
|
||||||
end
|
end
|
||||||
@@ -402,7 +405,7 @@ function B:CanItemGoInBag(bag, slot, targetBag)
|
|||||||
local item = bagIDs[B:Encode_BagSlot(bag, slot)]
|
local item = bagIDs[B:Encode_BagSlot(bag, slot)]
|
||||||
local itemFamily = B:GetItemFamily(item)
|
local itemFamily = B:GetItemFamily(item)
|
||||||
if itemFamily and itemFamily > 0 then
|
if itemFamily and itemFamily > 0 then
|
||||||
local equipSlot = select(7, GetItemInfo(item))
|
local equipSlot = select(8, GetItemInfo(item))
|
||||||
if equipSlot == "INVTYPE_BAG" then
|
if equipSlot == "INVTYPE_BAG" then
|
||||||
itemFamily = 1
|
itemFamily = 1
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -114,8 +114,7 @@ function mod:ExperienceBar_OnClick()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function mod:UpdateExperienceDimensions()
|
function mod:UpdateExperienceDimensions()
|
||||||
self.expBar:SetWidth(self.db.experience.width)
|
E:Size(self.expBar, self.db.experience.width, self.db.experience.height)
|
||||||
self.expBar:SetHeight(self.db.experience.height)
|
|
||||||
|
|
||||||
E:FontTemplate(self.expBar.text, LSM:Fetch("font", self.db.experience.font), self.db.experience.textSize, self.db.experience.fontOutline)
|
E:FontTemplate(self.expBar.text, LSM:Fetch("font", self.db.experience.font), self.db.experience.textSize, self.db.experience.fontOutline)
|
||||||
self.expBar.rested:SetOrientation(self.db.experience.orientation)
|
self.expBar.rested:SetOrientation(self.db.experience.orientation)
|
||||||
@@ -158,6 +157,8 @@ function mod:LoadExperienceBar()
|
|||||||
self.expBar.rested:SetStatusBarTexture(E.media.normTex)
|
self.expBar.rested:SetStatusBarTexture(E.media.normTex)
|
||||||
E:RegisterStatusBar(self.expBar.rested)
|
E:RegisterStatusBar(self.expBar.rested)
|
||||||
self.expBar.rested:SetStatusBarColor(1, 0, 1, 0.2)
|
self.expBar.rested:SetStatusBarColor(1, 0, 1, 0.2)
|
||||||
|
E:Kill(ExhaustionTick)
|
||||||
|
E:Kill(MainMenuExpBar)
|
||||||
|
|
||||||
self:UpdateExperienceDimensions()
|
self:UpdateExperienceDimensions()
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,8 @@ local GetInventoryItemDurability = GetInventoryItemDurability
|
|||||||
local GetInventoryItemTexture = GetInventoryItemTexture
|
local GetInventoryItemTexture = GetInventoryItemTexture
|
||||||
local GetInventorySlotInfo = GetInventorySlotInfo
|
local GetInventorySlotInfo = GetInventorySlotInfo
|
||||||
local ToggleCharacter = ToggleCharacter
|
local ToggleCharacter = ToggleCharacter
|
||||||
local DURABILITY_TEMPLATE = string.gsub(DURABILITY_TEMPLATE, "%%d / %%d", "(%%d+) / (%%d+)")
|
|
||||||
|
|
||||||
local DURABILITY = "Durability" -- Neel ElvUI locale
|
local DURABILITY = "Durability"
|
||||||
|
|
||||||
local displayString = ""
|
local displayString = ""
|
||||||
local tooltipString = "%d%%"
|
local tooltipString = "%d%%"
|
||||||
@@ -34,26 +33,6 @@ local slots = {
|
|||||||
"HeadSlot"
|
"HeadSlot"
|
||||||
}
|
}
|
||||||
|
|
||||||
local scan
|
|
||||||
local function GetInventoryItemDurability(slot)
|
|
||||||
if not GetInventoryItemTexture("player", slot) then return nil, nil end
|
|
||||||
|
|
||||||
if not scan then
|
|
||||||
scan = CreateFrame("GameTooltip", "DurabilityScan", nil, "ShoppingTooltipTemplate")
|
|
||||||
scan:SetOwner(UIParent, "ANCHOR_NONE")
|
|
||||||
end
|
|
||||||
|
|
||||||
scan:ClearLines()
|
|
||||||
scan:SetInventoryItem("player", slot)
|
|
||||||
|
|
||||||
for i = 4, scan:NumLines() do
|
|
||||||
local text = _G[scan:GetName().."TextLeft"..i]:GetText()
|
|
||||||
for durability, max in string.gfind(text, DURABILITY_TEMPLATE) do
|
|
||||||
return tonumber(durability), tonumber(max)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function OnEvent(self, t)
|
local function OnEvent(self, t)
|
||||||
lastPanel = self
|
lastPanel = self
|
||||||
totalDurability = 100
|
totalDurability = 100
|
||||||
|
|||||||
@@ -48,15 +48,15 @@ end
|
|||||||
|
|
||||||
function M:GetLocTextColor()
|
function M:GetLocTextColor()
|
||||||
local pvpType = GetZonePVPInfo()
|
local pvpType = GetZonePVPInfo()
|
||||||
if(pvpType == "sanctuary") then
|
if pvpType == "sanctuary" then
|
||||||
return 0.035, 0.58, 0.84
|
return 0.035, 0.58, 0.84
|
||||||
elseif(pvpType == "arena") then
|
elseif pvpType == "arena" then
|
||||||
return 0.84, 0.03, 0.03
|
return 0.84, 0.03, 0.03
|
||||||
elseif(pvpType == "friendly") then
|
elseif pvpType == "friendly" then
|
||||||
return 0.05, 0.85, 0.03
|
return 0.05, 0.85, 0.03
|
||||||
elseif(pvpType == "hostile") then
|
elseif pvpType == "hostile" then
|
||||||
return 0.84, 0.03, 0.03
|
return 0.84, 0.03, 0.03
|
||||||
elseif(pvpType == "contested") then
|
elseif pvpType == "contested" then
|
||||||
return 0.9, 0.85, 0.05
|
return 0.9, 0.85, 0.05
|
||||||
else
|
else
|
||||||
return 0.84, 0.03, 0.03
|
return 0.84, 0.03, 0.03
|
||||||
@@ -104,7 +104,7 @@ local function ResetZoom()
|
|||||||
isResetting = false
|
isResetting = false
|
||||||
end
|
end
|
||||||
local function SetupZoomReset()
|
local function SetupZoomReset()
|
||||||
if(E.db.general.minimap.resetZoom.enable and not isResetting) then
|
if E.db.general.minimap.resetZoom.enable and not isResetting then
|
||||||
isResetting = true
|
isResetting = true
|
||||||
E:Delay(E.db.general.minimap.resetZoom.time, ResetZoom)
|
E:Delay(E.db.general.minimap.resetZoom.time, ResetZoom)
|
||||||
end
|
end
|
||||||
@@ -120,8 +120,8 @@ function M:UpdateSettings()
|
|||||||
Minimap:SetScale(E.MinimapSize / 140)
|
Minimap:SetScale(E.MinimapSize / 140)
|
||||||
end
|
end
|
||||||
|
|
||||||
if(LeftMiniPanel and RightMiniPanel) then
|
if LeftMiniPanel and RightMiniPanel then
|
||||||
if(E.db.datatexts.minimapPanels and E.private.general.minimap.enable) then
|
if E.db.datatexts.minimapPanels and E.private.general.minimap.enable then
|
||||||
LeftMiniPanel:Show()
|
LeftMiniPanel:Show()
|
||||||
RightMiniPanel:Show()
|
RightMiniPanel:Show()
|
||||||
else
|
else
|
||||||
@@ -130,48 +130,48 @@ function M:UpdateSettings()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if(BottomMiniPanel) then
|
if BottomMiniPanel then
|
||||||
if(E.db.datatexts.minimapBottom and E.private.general.minimap.enable) then
|
if E.db.datatexts.minimapBottom and E.private.general.minimap.enable then
|
||||||
BottomMiniPanel:Show()
|
BottomMiniPanel:Show()
|
||||||
else
|
else
|
||||||
BottomMiniPanel:Hide()
|
BottomMiniPanel:Hide()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if(BottomLeftMiniPanel) then
|
if BottomLeftMiniPanel then
|
||||||
if(E.db.datatexts.minimapBottomLeft and E.private.general.minimap.enable) then
|
if E.db.datatexts.minimapBottomLeft and E.private.general.minimap.enable then
|
||||||
BottomLeftMiniPanel:Show()
|
BottomLeftMiniPanel:Show()
|
||||||
else
|
else
|
||||||
BottomLeftMiniPanel:Hide()
|
BottomLeftMiniPanel:Hide()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if(BottomRightMiniPanel) then
|
if BottomRightMiniPanel then
|
||||||
if(E.db.datatexts.minimapBottomRight and E.private.general.minimap.enable) then
|
if E.db.datatexts.minimapBottomRight and E.private.general.minimap.enable then
|
||||||
BottomRightMiniPanel:Show()
|
BottomRightMiniPanel:Show()
|
||||||
else
|
else
|
||||||
BottomRightMiniPanel:Hide()
|
BottomRightMiniPanel:Hide()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if(TopMiniPanel) then
|
if TopMiniPanel then
|
||||||
if(E.db.datatexts.minimapTop and E.private.general.minimap.enable) then
|
if E.db.datatexts.minimapTop and E.private.general.minimap.enable then
|
||||||
TopMiniPanel:Show()
|
TopMiniPanel:Show()
|
||||||
else
|
else
|
||||||
TopMiniPanel:Hide()
|
TopMiniPanel:Hide()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if(TopLeftMiniPanel) then
|
if TopLeftMiniPanel then
|
||||||
if(E.db.datatexts.minimapTopLeft and E.private.general.minimap.enable) then
|
if E.db.datatexts.minimapTopLeft and E.private.general.minimap.enable then
|
||||||
TopLeftMiniPanel:Show()
|
TopLeftMiniPanel:Show()
|
||||||
else
|
else
|
||||||
TopLeftMiniPanel:Hide()
|
TopLeftMiniPanel:Hide()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if(TopRightMiniPanel) then
|
if TopRightMiniPanel then
|
||||||
if(E.db.datatexts.minimapTopRight and E.private.general.minimap.enable) then
|
if E.db.datatexts.minimapTopRight and E.private.general.minimap.enable then
|
||||||
TopRightMiniPanel:Show()
|
TopRightMiniPanel:Show()
|
||||||
else
|
else
|
||||||
TopRightMiniPanel:Hide()
|
TopRightMiniPanel:Hide()
|
||||||
@@ -179,19 +179,19 @@ function M:UpdateSettings()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if MMHolder then
|
if MMHolder then
|
||||||
MMHolder:SetWidth(E.MinimapWidth + E.Border + E.Spacing*3)
|
E:Width(MMHolder, E.MinimapWidth + E.Border + E.Spacing*3)
|
||||||
|
|
||||||
if E.db.datatexts.minimapPanels then
|
if E.db.datatexts.minimapPanels then
|
||||||
MMHolder:SetHeight(E.MinimapHeight + (LeftMiniPanel and (LeftMiniPanel:GetHeight() + E.Border) or 24) + E.Spacing*3)
|
E:Height(MMHolder, E.MinimapHeight + (LeftMiniPanel and (LeftMiniPanel:GetHeight() + E.Border) or 24) + E.Spacing*3)
|
||||||
else
|
else
|
||||||
MMHolder:SetHeight(E.MinimapHeight + E.Border + E.Spacing*3)
|
E:Height(MMHolder, E.MinimapHeight + E.Border + E.Spacing*3)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if Minimap.location then
|
if Minimap.location then
|
||||||
Minimap.location:SetWidth(E.MinimapSize)
|
E:Width(Minimap.location, E.MinimapSize)
|
||||||
|
|
||||||
if(E.db.general.minimap.locationText ~= "SHOW" or not E.private.general.minimap.enable) then
|
if E.db.general.minimap.locationText ~= "SHOW" or not E.private.general.minimap.enable then
|
||||||
Minimap.location:Hide()
|
Minimap.location:Hide()
|
||||||
else
|
else
|
||||||
Minimap.location:Show()
|
Minimap.location:Show()
|
||||||
@@ -199,8 +199,7 @@ function M:UpdateSettings()
|
|||||||
end
|
end
|
||||||
|
|
||||||
if MinimapMover then
|
if MinimapMover then
|
||||||
MinimapMover:SetWidth(MMHolder:GetWidth())
|
E:Size(MinimapMover, MMHolder:GetWidth(), MMHolder:GetHeight())
|
||||||
MinimapMover:SetHeight(MMHolder:GetHeight())
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if GameTimeFrame then
|
if GameTimeFrame then
|
||||||
@@ -210,7 +209,7 @@ function M:UpdateSettings()
|
|||||||
local pos = E.db.general.minimap.icons.calendar.position or "TOPRIGHT"
|
local pos = E.db.general.minimap.icons.calendar.position or "TOPRIGHT"
|
||||||
local scale = E.db.general.minimap.icons.calendar.scale or 1
|
local scale = E.db.general.minimap.icons.calendar.scale or 1
|
||||||
GameTimeFrame:ClearAllPoints()
|
GameTimeFrame:ClearAllPoints()
|
||||||
GameTimeFrame:SetPoint(pos, Minimap, pos, E.db.general.minimap.icons.calendar.xOffset or 0, E.db.general.minimap.icons.calendar.yOffset or 0)
|
E:Point(GameTimeFrame, pos, Minimap, pos, E.db.general.minimap.icons.calendar.xOffset or 0, E.db.general.minimap.icons.calendar.yOffset or 0)
|
||||||
GameTimeFrame:SetScale(scale)
|
GameTimeFrame:SetScale(scale)
|
||||||
GameTimeFrame:Show()
|
GameTimeFrame:Show()
|
||||||
end
|
end
|
||||||
@@ -220,7 +219,7 @@ function M:UpdateSettings()
|
|||||||
local pos = E.db.general.minimap.icons.mail.position or "TOPRIGHT"
|
local pos = E.db.general.minimap.icons.mail.position or "TOPRIGHT"
|
||||||
local scale = E.db.general.minimap.icons.mail.scale or 1
|
local scale = E.db.general.minimap.icons.mail.scale or 1
|
||||||
MiniMapMailFrame:ClearAllPoints()
|
MiniMapMailFrame:ClearAllPoints()
|
||||||
MiniMapMailFrame:SetPoint(pos, Minimap, pos, E.db.general.minimap.icons.mail.xOffset or 3, E.db.general.minimap.icons.mail.yOffset or 4)
|
E:Point(MiniMapMailFrame, pos, Minimap, pos, E.db.general.minimap.icons.mail.xOffset or 3, E.db.general.minimap.icons.mail.yOffset or 4)
|
||||||
MiniMapMailFrame:SetScale(scale)
|
MiniMapMailFrame:SetScale(scale)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -228,7 +227,7 @@ function M:UpdateSettings()
|
|||||||
local pos = E.db.general.minimap.icons.battlefield.position or "BOTTOMRIGHT"
|
local pos = E.db.general.minimap.icons.battlefield.position or "BOTTOMRIGHT"
|
||||||
local scale = E.db.general.minimap.icons.battlefield.scale or 1
|
local scale = E.db.general.minimap.icons.battlefield.scale or 1
|
||||||
MiniMapBattlefieldFrame:ClearAllPoints()
|
MiniMapBattlefieldFrame:ClearAllPoints()
|
||||||
MiniMapBattlefieldFrame:SetPoint(pos, Minimap, pos, E.db.general.minimap.icons.battlefield.xOffset or 3, E.db.general.minimap.icons.battlefield.yOffset or 0)
|
E:Point(MiniMapBattlefieldFrame, pos, Minimap, pos, E.db.general.minimap.icons.battlefield.xOffset or 3, E.db.general.minimap.icons.battlefield.yOffset or 0)
|
||||||
MiniMapBattlefieldFrame:SetScale(scale)
|
MiniMapBattlefieldFrame:SetScale(scale)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -238,7 +237,7 @@ function M:UpdateSettings()
|
|||||||
local x = E.db.general.minimap.icons.difficulty.xOffset or 0
|
local x = E.db.general.minimap.icons.difficulty.xOffset or 0
|
||||||
local y = E.db.general.minimap.icons.difficulty.yOffset or 0
|
local y = E.db.general.minimap.icons.difficulty.yOffset or 0
|
||||||
MiniMapInstanceDifficulty:ClearAllPoints()
|
MiniMapInstanceDifficulty:ClearAllPoints()
|
||||||
MiniMapInstanceDifficulty:SetPoint(pos, Minimap, pos, x, y)
|
E:Point(MiniMapInstanceDifficulty, pos, Minimap, pos, x, y)
|
||||||
MiniMapInstanceDifficulty:SetScale(scale)
|
MiniMapInstanceDifficulty:SetScale(scale)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -261,11 +260,10 @@ function M:Initialize()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local mmholder = CreateFrame("Frame", "MMHolder", UIParent)
|
local mmholder = CreateFrame("Frame", "MMHolder", UIParent)
|
||||||
mmholder:SetPoint("TOPRIGHT", E.UIParent, "TOPRIGHT", -3, -3)
|
E:Point(mmholder, "TOPRIGHT", E.UIParent, "TOPRIGHT", -3, -3)
|
||||||
mmholder:SetWidth(E.MinimapWidth + 29)
|
E:Size(mmholder, E.MinimapWidth + 29, E.MinimapHeight + 53)
|
||||||
mmholder:SetHeight(E.MinimapHeight + 53)
|
|
||||||
Minimap:ClearAllPoints()
|
Minimap:ClearAllPoints()
|
||||||
Minimap:SetPoint("TOPRIGHT", mmholder, "TOPRIGHT", -E.Border, -E.Border)
|
E:Point(Minimap, "TOPRIGHT", mmholder, "TOPRIGHT", -E.Border, -E.Border)
|
||||||
|
|
||||||
Minimap:SetMaskTexture("Interface\\ChatFrame\\ChatFrameBackground")
|
Minimap:SetMaskTexture("Interface\\ChatFrame\\ChatFrameBackground")
|
||||||
Minimap.backdrop = CreateFrame("Frame", nil, UIParent)
|
Minimap.backdrop = CreateFrame("Frame", nil, UIParent)
|
||||||
@@ -289,7 +287,7 @@ function M:Initialize()
|
|||||||
|
|
||||||
Minimap.location = Minimap:CreateFontString(nil, "OVERLAY")
|
Minimap.location = Minimap:CreateFontString(nil, "OVERLAY")
|
||||||
E:FontTemplate(Minimap.location, nil, nil, "OUTLINE")
|
E:FontTemplate(Minimap.location, nil, nil, "OUTLINE")
|
||||||
Minimap.location:SetPoint("TOP", Minimap, "TOP", 0, -2)
|
E:Point(Minimap.location, "TOP", Minimap, "TOP", 0, -2)
|
||||||
Minimap.location:SetJustifyH("CENTER")
|
Minimap.location:SetJustifyH("CENTER")
|
||||||
Minimap.location:SetJustifyV("MIDDLE")
|
Minimap.location:SetJustifyV("MIDDLE")
|
||||||
if E.db.general.minimap.locationText ~= "SHOW" or not E.private.general.minimap.enable then
|
if E.db.general.minimap.locationText ~= "SHOW" or not E.private.general.minimap.enable then
|
||||||
@@ -323,9 +321,8 @@ function M:Initialize()
|
|||||||
self:RegisterEvent("PLAYER_ENTERING_WORLD", "Update_ZoneText")
|
self:RegisterEvent("PLAYER_ENTERING_WORLD", "Update_ZoneText")
|
||||||
|
|
||||||
local fm = CreateFrame("Minimap", "FarmModeMap", E.UIParent)
|
local fm = CreateFrame("Minimap", "FarmModeMap", E.UIParent)
|
||||||
fm:SetWidth(E.db.farmSize)
|
E:Size(fm, E.db.farmSize)
|
||||||
fm:SetHeight(E.db.farmSize)
|
E:Point(fm, "TOP", E.UIParent, "TOP", 0, -120)
|
||||||
fm:SetPoint("TOP", E.UIParent, "TOP", 0, -120)
|
|
||||||
fm:SetClampedToScreen(true)
|
fm:SetClampedToScreen(true)
|
||||||
E:CreateBackdrop(fm, "Default")
|
E:CreateBackdrop(fm, "Default")
|
||||||
fm:EnableMouseWheel(true)
|
fm:EnableMouseWheel(true)
|
||||||
@@ -338,14 +335,14 @@ function M:Initialize()
|
|||||||
fm:Hide()
|
fm:Hide()
|
||||||
|
|
||||||
FarmModeMap:SetScript("OnShow", function()
|
FarmModeMap:SetScript("OnShow", function()
|
||||||
if(BuffsMover and not E:HasMoverBeenMoved("BuffsMover")) then
|
if BuffsMover and not E:HasMoverBeenMoved("BuffsMover") then
|
||||||
BuffsMover:ClearAllPoints()
|
BuffsMover:ClearAllPoints()
|
||||||
BuffsMover:SetPoint("TOPRIGHT", E.UIParent, "TOPRIGHT", -3, -3)
|
E:Point(BuffsMover, "TOPRIGHT", E.UIParent, "TOPRIGHT", -3, -3)
|
||||||
end
|
end
|
||||||
|
|
||||||
if(DebuffsMover and not E:HasMoverBeenMoved("DebuffsMover")) then
|
if DebuffsMover and not E:HasMoverBeenMoved("DebuffsMover") then
|
||||||
DebuffsMover:ClearAllPoints()
|
DebuffsMover:ClearAllPoints()
|
||||||
DebuffsMover:SetPoint("TOPRIGHT", ElvUIPlayerBuffs, "BOTTOMRIGHT", 0, -3)
|
E:Point(DebuffsMover, "TOPRIGHT", ElvUIPlayerBuffs, "BOTTOMRIGHT", 0, -3)
|
||||||
end
|
end
|
||||||
|
|
||||||
MinimapCluster:ClearAllPoints()
|
MinimapCluster:ClearAllPoints()
|
||||||
@@ -353,11 +350,11 @@ function M:Initialize()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
FarmModeMap:SetScript("OnHide", function()
|
FarmModeMap:SetScript("OnHide", function()
|
||||||
if(BuffsMover and not E:HasMoverBeenMoved("BuffsMover")) then
|
if BuffsMover and not E:HasMoverBeenMoved("BuffsMover") then
|
||||||
E:ResetMovers(L["Player Buffs"])
|
E:ResetMovers(L["Player Buffs"])
|
||||||
end
|
end
|
||||||
|
|
||||||
if(DebuffsMover and not E:HasMoverBeenMoved("DebuffsMover")) then
|
if DebuffsMover and not E:HasMoverBeenMoved("DebuffsMover") then
|
||||||
E:ResetMovers(L["Player Debuffs"])
|
E:ResetMovers(L["Player Debuffs"])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ local AFK = E:NewModule("AFK", "AceEvent-3.0", "AceTimer-3.0");
|
|||||||
--Cache global variables
|
--Cache global variables
|
||||||
--Lua functions
|
--Lua functions
|
||||||
local _G = _G
|
local _G = _G
|
||||||
local GetTime = GetTime
|
|
||||||
local floor = math.floor
|
local floor = math.floor
|
||||||
--WoW API / Variables
|
--WoW API / Variables
|
||||||
local CinematicFrame = CinematicFrame
|
local CinematicFrame = CinematicFrame
|
||||||
@@ -14,12 +13,12 @@ local GetBattlefieldStatus = GetBattlefieldStatus
|
|||||||
local GetGuildInfo = GetGuildInfo
|
local GetGuildInfo = GetGuildInfo
|
||||||
local GetScreenHeight = GetScreenHeight
|
local GetScreenHeight = GetScreenHeight
|
||||||
local GetScreenWidth = GetScreenWidth
|
local GetScreenWidth = GetScreenWidth
|
||||||
|
local GetTime = GetTime
|
||||||
local UnitAffectingCombat = UnitAffectingCombat
|
local UnitAffectingCombat = UnitAffectingCombat
|
||||||
local IsInGuild = IsInGuild
|
local IsInGuild = IsInGuild
|
||||||
local IsShiftKeyDown = IsShiftKeyDown
|
local IsShiftKeyDown = IsShiftKeyDown
|
||||||
local Screenshot = Screenshot
|
local Screenshot = Screenshot
|
||||||
local SetCVar = SetCVar
|
local SetCVar = SetCVar
|
||||||
local UnitFactionGroup = UnitFactionGroup
|
|
||||||
|
|
||||||
local CUSTOM_CLASS_COLORS = CUSTOM_CLASS_COLORS
|
local CUSTOM_CLASS_COLORS = CUSTOM_CLASS_COLORS
|
||||||
local MAX_BATTLEFIELD_QUEUES = MAX_BATTLEFIELD_QUEUES
|
local MAX_BATTLEFIELD_QUEUES = MAX_BATTLEFIELD_QUEUES
|
||||||
@@ -185,11 +184,11 @@ function AFK:OnEvent(event, ...)
|
|||||||
|
|
||||||
if not E.db.general.afk then return end
|
if not E.db.general.afk then return end
|
||||||
if UnitAffectingCombat("player") or CinematicFrame:IsShown() then return end
|
if UnitAffectingCombat("player") or CinematicFrame:IsShown() then return end
|
||||||
-- if UnitCastingInfo("player") ~= nil then
|
-- if UnitCastingInfo("player") ~= nil then
|
||||||
-- --Don't activate afk if player is crafting stuff, check back in 30 seconds
|
-- --Don't activate afk if player is crafting stuff, check back in 30 seconds
|
||||||
-- self:ScheduleTimer("OnEvent", 30)
|
-- self:ScheduleTimer("OnEvent", 30)
|
||||||
-- return
|
-- return
|
||||||
-- end
|
-- end
|
||||||
|
|
||||||
if arg1 == format(MARKED_AFK_MESSAGE, DEFAULT_AFK_MESSAGE) then
|
if arg1 == format(MARKED_AFK_MESSAGE, DEFAULT_AFK_MESSAGE) then
|
||||||
self:SetAFK(true)
|
self:SetAFK(true)
|
||||||
@@ -284,11 +283,9 @@ function AFK:Initialize()
|
|||||||
E:Size(self.AFKMode.bottom.logo, 320, 150)
|
E:Size(self.AFKMode.bottom.logo, 320, 150)
|
||||||
E:Point(self.AFKMode.bottom.logo, "CENTER", self.AFKMode.bottom, "CENTER", 0, 50)
|
E:Point(self.AFKMode.bottom.logo, "CENTER", self.AFKMode.bottom, "CENTER", 0, 50)
|
||||||
self.AFKMode.bottom.logo:SetTexture("Interface\\AddOns\\ElvUI\\media\\textures\\logo")
|
self.AFKMode.bottom.logo:SetTexture("Interface\\AddOns\\ElvUI\\media\\textures\\logo")
|
||||||
|
|
||||||
local factionGroup = UnitFactionGroup("player")
|
|
||||||
self.AFKMode.bottom.faction = self.AFKMode.bottom:CreateTexture(nil, "OVERLAY")
|
self.AFKMode.bottom.faction = self.AFKMode.bottom:CreateTexture(nil, "OVERLAY")
|
||||||
E:Point(self.AFKMode.bottom.faction, "BOTTOMLEFT", self.AFKMode.bottom, "BOTTOMLEFT", -20, -16)
|
E:Point(self.AFKMode.bottom.faction, "BOTTOMLEFT", self.AFKMode.bottom, "BOTTOMLEFT", -20, -16)
|
||||||
self.AFKMode.bottom.faction:SetTexture("Interface\\AddOns\\ElvUI\\media\\textures\\"..factionGroup.."-Logo")
|
self.AFKMode.bottom.faction:SetTexture("Interface\\AddOns\\ElvUI\\media\\textures\\"..E.myfaction.."-Logo")
|
||||||
E:Size(self.AFKMode.bottom.faction, 140)
|
E:Size(self.AFKMode.bottom.faction, 140)
|
||||||
|
|
||||||
self.AFKMode.bottom.name = self.AFKMode.bottom:CreateFontString(nil, "OVERLAY")
|
self.AFKMode.bottom.name = self.AFKMode.bottom:CreateFontString(nil, "OVERLAY")
|
||||||
|
|||||||
@@ -543,7 +543,7 @@ function mod:QueueObject(object)
|
|||||||
object:SetTexture("")
|
object:SetTexture("")
|
||||||
object:SetTexCoord(0, 0, 0, 0)
|
object:SetTexCoord(0, 0, 0, 0)
|
||||||
elseif objectType == "FontString" then
|
elseif objectType == "FontString" then
|
||||||
E:Width(object, 0.001)
|
object:SetWidth(0.001)
|
||||||
elseif objectType == "StatusBar" then
|
elseif objectType == "StatusBar" then
|
||||||
object:SetStatusBarTexture("")
|
object:SetStatusBarTexture("")
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,27 +1,30 @@
|
|||||||
local E, L, V, P, G = unpack(ElvUI)
|
local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
||||||
local UF = E:GetModule("UnitFrames");
|
local UF = E:GetModule("UnitFrames");
|
||||||
local ns = oUF
|
local ns = oUF;
|
||||||
local ElvUF = ns.oUF
|
local ElvUF = ns.oUF;
|
||||||
|
|
||||||
local _G = _G;
|
--Cache global variables
|
||||||
local setmetatable, getfenv, setfenv = setmetatable, getfenv, setfenv;
|
--Lua functions
|
||||||
local type, unpack, select, pairs = type, unpack, select, pairs;
|
local _G = _G
|
||||||
local min, random = math.min, math.random;
|
local setmetatable, getfenv, setfenv = setmetatable, getfenv, setfenv
|
||||||
local format = string.format;
|
local type, unpack, select, pairs = type, unpack, select, pairs
|
||||||
|
local min, random = math.min, math.random
|
||||||
local UnitMana = UnitMana;
|
local format = string.format
|
||||||
local UnitManaMax = UnitManaMax;
|
local find = string.find
|
||||||
local UnitHealth = UnitHealth;
|
--WoW API / Variables
|
||||||
local UnitHealthMax = UnitHealthMax;
|
local UnitMana = UnitMana
|
||||||
local UnitName = UnitName;
|
local UnitManaMax = UnitManaMax
|
||||||
local UnitClass = UnitClass;
|
local UnitHealth = UnitHealth
|
||||||
local InCombatLockdown = InCombatLockdown;
|
local UnitHealthMax = UnitHealthMax
|
||||||
local UnregisterUnitWatch = UnregisterUnitWatch;
|
local UnitName = UnitName
|
||||||
local RegisterUnitWatch = RegisterUnitWatch;
|
local UnitClass = UnitClass
|
||||||
local RegisterStateDriver = RegisterStateDriver;
|
local UnitAffectingCombat = UnitAffectingCombat
|
||||||
local LOCALIZED_CLASS_NAMES_MALE = LOCALIZED_CLASS_NAMES_MALE;
|
local UnregisterUnitWatch = UnregisterUnitWatch
|
||||||
local CLASS_SORT_ORDER = CLASS_SORT_ORDER;
|
local RegisterUnitWatch = RegisterUnitWatch
|
||||||
local MAX_RAID_MEMBERS = MAX_RAID_MEMBERS;
|
local RegisterStateDriver = RegisterStateDriver
|
||||||
|
local LOCALIZED_CLASS_NAMES_MALE = LOCALIZED_CLASS_NAMES_MALE
|
||||||
|
local CLASS_SORT_ORDER = CLASS_SORT_ORDER
|
||||||
|
local MAX_RAID_MEMBERS = MAX_RAID_MEMBERS
|
||||||
|
|
||||||
local attributeBlacklist = {["showRaid"] = true, ["showParty"] = true, ["showSolo"] = true}
|
local attributeBlacklist = {["showRaid"] = true, ["showParty"] = true, ["showSolo"] = true}
|
||||||
local configEnv
|
local configEnv
|
||||||
@@ -29,45 +32,45 @@ local originalEnvs = {}
|
|||||||
local overrideFuncs = {}
|
local overrideFuncs = {}
|
||||||
|
|
||||||
local function createConfigEnv()
|
local function createConfigEnv()
|
||||||
if( configEnv ) then return end
|
if configEnv then return end
|
||||||
configEnv = setmetatable({
|
configEnv = setmetatable({
|
||||||
UnitMana = function (unit, displayType)
|
UnitMana = function (unit, displayType)
|
||||||
if(unit:find("target") or unit:find("focus")) then
|
if find(unit, "target") or find(unit, "focus") then
|
||||||
return UnitMana(unit, displayType);
|
return UnitMana(unit, displayType)
|
||||||
end
|
end
|
||||||
|
|
||||||
return random(1, UnitManaMax(unit, displayType) or 1);
|
return random(1, UnitManaMax(unit, displayType) or 1)
|
||||||
end,
|
end,
|
||||||
UnitHealth = function(unit)
|
UnitHealth = function(unit)
|
||||||
if(unit:find("target") or unit:find("focus")) then
|
if find(unit, "target") or find(unit, "focus") then
|
||||||
return UnitHealth(unit);
|
return UnitHealth(unit)
|
||||||
end
|
end
|
||||||
|
|
||||||
return random(1, UnitHealthMax(unit));
|
return random(1, UnitHealthMax(unit))
|
||||||
end,
|
end,
|
||||||
UnitName = function(unit)
|
UnitName = function(unit)
|
||||||
if(unit:find("target") or unit:find("focus")) then
|
if find(unit, "target") or find(unit, "focus") then
|
||||||
return UnitName(unit);
|
return UnitName(unit)
|
||||||
end
|
end
|
||||||
if(E.CreditsList) then
|
if E.CreditsList then
|
||||||
local max = #E.CreditsList;
|
local max = getn(E.CreditsList)
|
||||||
return E.CreditsList[random(1, max)];
|
return E.CreditsList[random(1, max)]
|
||||||
end
|
end
|
||||||
return "Test Name";
|
return "Test Name"
|
||||||
end,
|
end,
|
||||||
UnitClass = function(unit)
|
UnitClass = function(unit)
|
||||||
if(unit:find("target") or unit:find("focus")) then
|
if find(unit, "target") or find(unit, "focus") then
|
||||||
return UnitClass(unit);
|
return UnitClass(unit)
|
||||||
end
|
end
|
||||||
|
|
||||||
local classToken = CLASS_SORT_ORDER[random(1, #(CLASS_SORT_ORDER))];
|
local classToken = CLASS_SORT_ORDER[random(1, getn(CLASS_SORT_ORDER))]
|
||||||
return LOCALIZED_CLASS_NAMES_MALE[classToken], classToken;
|
return LOCALIZED_CLASS_NAMES_MALE[classToken], classToken
|
||||||
end,
|
end,
|
||||||
Hex = function(r, g, b)
|
Hex = function(r, g, b)
|
||||||
if(type(r) == "table") then
|
if type(r) == "table" then
|
||||||
if(r.r) then r, g, b = r.r, r.g, r.b; else r, g, b = unpack(r); end
|
if r.r then r, g, b = r.r, r.g, r.b else r, g, b = unpack(r) end
|
||||||
end
|
end
|
||||||
return format("|cff%02x%02x%02x", r*255, g*255, b*255);
|
return format("|cff%02x%02x%02x", r*255, g*255, b*255)
|
||||||
end,
|
end,
|
||||||
ColorGradient = ElvUF.ColorGradient,
|
ColorGradient = ElvUF.ColorGradient,
|
||||||
}, {
|
}, {
|
||||||
@@ -101,11 +104,11 @@ local function createConfigEnv()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function UF:ForceShow(frame)
|
function UF:ForceShow(frame)
|
||||||
if InCombatLockdown() then return; end
|
if UnitAffectingCombat("player") then return end
|
||||||
if not frame.isForced then
|
if not frame.isForced then
|
||||||
frame.oldUnit = frame.unit
|
frame.oldUnit = frame.unit
|
||||||
frame.unit = "player"
|
frame.unit = "player"
|
||||||
frame.isForced = true;
|
frame.isForced = true
|
||||||
frame.oldOnUpdate = frame:GetScript("OnUpdate")
|
frame.oldOnUpdate = frame:GetScript("OnUpdate")
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -119,17 +122,17 @@ function UF:ForceShow(frame)
|
|||||||
frame:Update()
|
frame:Update()
|
||||||
end
|
end
|
||||||
|
|
||||||
if(_G[frame:GetName().."Target"]) then
|
if _G[frame:GetName().."Target"] then
|
||||||
self:ForceShow(_G[frame:GetName().."Target"]);
|
self:ForceShow(_G[frame:GetName().."Target"])
|
||||||
end
|
end
|
||||||
|
|
||||||
if(_G[frame:GetName().."Pet"]) then
|
if _G[frame:GetName().."Pet"] then
|
||||||
self:ForceShow(_G[frame:GetName().."Pet"]);
|
self:ForceShow(_G[frame:GetName().."Pet"])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function UF:UnforceShow(frame)
|
function UF:UnforceShow(frame)
|
||||||
if InCombatLockdown() then return; end
|
if UnitAffectingCombat("player") then return end
|
||||||
if not frame.isForced then
|
if not frame.isForced then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@@ -152,11 +155,11 @@ function UF:UnforceShow(frame)
|
|||||||
frame:Update()
|
frame:Update()
|
||||||
end
|
end
|
||||||
|
|
||||||
if(_G[frame:GetName().."Target"]) then
|
if _G[frame:GetName().."Target"] then
|
||||||
self:UnforceShow(_G[frame:GetName().."Target"])
|
self:UnforceShow(_G[frame:GetName().."Target"])
|
||||||
end
|
end
|
||||||
|
|
||||||
if(_G[frame:GetName().."Pet"]) then
|
if _G[frame:GetName().."Pet"] then
|
||||||
self:UnforceShow(_G[frame:GetName().."Pet"])
|
self:UnforceShow(_G[frame:GetName().."Pet"])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -164,11 +167,10 @@ end
|
|||||||
function UF:ShowChildUnits(header, ...)
|
function UF:ShowChildUnits(header, ...)
|
||||||
header.isForced = true
|
header.isForced = true
|
||||||
|
|
||||||
for i=1, select("#", ...) do
|
for i = 1, arg.n do
|
||||||
local frame = select(i, ...)
|
local frame = arg[i]
|
||||||
frame:RegisterForClicks(nil)
|
frame:RegisterForClicks(nil)
|
||||||
frame:SetID(i)
|
frame:SetID(i)
|
||||||
frame.TargetGlow:SetAlpha(0)
|
|
||||||
self:ForceShow(frame)
|
self:ForceShow(frame)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -176,16 +178,15 @@ end
|
|||||||
function UF:UnshowChildUnits(header, ...)
|
function UF:UnshowChildUnits(header, ...)
|
||||||
header.isForced = nil
|
header.isForced = nil
|
||||||
|
|
||||||
for i=1, select("#", ...) do
|
for i = 1, arg.n do
|
||||||
local frame = select(i, ...)
|
local frame = arg[i]
|
||||||
frame:RegisterForClicks(self.db.targetOnMouseDown and "AnyDown" or "AnyUp")
|
frame:RegisterForClicks(self.db.targetOnMouseDown and "AnyDown" or "AnyUp")
|
||||||
frame.TargetGlow:SetAlpha(1)
|
|
||||||
self:UnforceShow(frame)
|
self:UnforceShow(frame)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function OnAttributeChanged(self)
|
local function OnAttributeChanged(self)
|
||||||
if not self:GetParent().forceShow and not self.forceShow then return; end
|
if not self:GetParent().forceShow and not self.forceShow then return end
|
||||||
if not self:IsShown() then return end
|
if not self:IsShown() then return end
|
||||||
|
|
||||||
local db = self.db or self:GetParent().db
|
local db = self.db or self:GetParent().db
|
||||||
@@ -199,7 +200,7 @@ local function OnAttributeChanged(self)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function UF:HeaderConfig(header, configMode)
|
function UF:HeaderConfig(header, configMode)
|
||||||
if InCombatLockdown() then return; end
|
if UnitAffectingCombat("player") then return end
|
||||||
|
|
||||||
createConfigEnv()
|
createConfigEnv()
|
||||||
header.forceShow = configMode
|
header.forceShow = configMode
|
||||||
@@ -216,27 +217,27 @@ function UF:HeaderConfig(header, configMode)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
RegisterStateDriver(header, "visibility", "show")
|
--RegisterStateDriver(header, "visibility", "show")
|
||||||
else
|
else
|
||||||
for func, env in pairs(originalEnvs) do
|
for func, env in pairs(originalEnvs) do
|
||||||
setfenv(func, env)
|
setfenv(func, env)
|
||||||
originalEnvs[func] = nil
|
originalEnvs[func] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
RegisterStateDriver(header, "visibility", header.db.visibility)
|
--RegisterStateDriver(header, "visibility", header.db.visibility)
|
||||||
|
|
||||||
if(header:GetScript("OnEvent")) then
|
if header:GetScript("OnEvent") then
|
||||||
header:GetScript("OnEvent")(header, "PLAYER_ENTERING_WORLD");
|
header:GetScript("OnEvent")(header, "PLAYER_ENTERING_WORLD")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for i=1, #header.groups do
|
for i = 1, getn(header.groups) do
|
||||||
local group = header.groups[i]
|
local group = header.groups[i]
|
||||||
|
|
||||||
if group:IsShown() then
|
if group:IsShown() then
|
||||||
group.forceShow = header.forceShow
|
group.forceShow = header.forceShow
|
||||||
group.forceShowAuras = header.forceShowAuras
|
group.forceShowAuras = header.forceShowAuras
|
||||||
group:HookScript("OnAttributeChanged", OnAttributeChanged)
|
--HookScript(group, "OnAttributeChanged", OnAttributeChanged)
|
||||||
if configMode then
|
if configMode then
|
||||||
for key in pairs(attributeBlacklist) do
|
for key in pairs(attributeBlacklist) do
|
||||||
group:SetAttribute(key, nil)
|
group:SetAttribute(key, nil)
|
||||||
@@ -258,7 +259,7 @@ function UF:HeaderConfig(header, configMode)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
UF["headerFunctions"][header.groupName]:AdjustVisibility(header);
|
UF["headerFunctions"][header.groupName]:AdjustVisibility(header)
|
||||||
end
|
end
|
||||||
|
|
||||||
function UF:PLAYER_REGEN_DISABLED()
|
function UF:PLAYER_REGEN_DISABLED()
|
||||||
@@ -275,19 +276,7 @@ function UF:PLAYER_REGEN_DISABLED()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
for i=1, 5 do
|
for i = 1, 4 do
|
||||||
if self["arena"..i] and self["arena"..i].isForced then
|
|
||||||
self:UnforceShow(self["arena"..i])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
for i=1, 4 do
|
|
||||||
if self["boss"..i] and self["boss"..i].isForced then
|
|
||||||
self:UnforceShow(self["boss"..i])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
for i=1, 4 do
|
|
||||||
if self["party"..i] and self["party"..i].isForced then
|
if self["party"..i] and self["party"..i].isForced then
|
||||||
self:UnforceShow(self["party"..i])
|
self:UnforceShow(self["party"..i])
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,288 @@
|
|||||||
|
local E, L, V, P, G = unpack(ElvUI) --Inport: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
||||||
|
local UF = E:GetModule("UnitFrames")
|
||||||
|
|
||||||
|
--Cache global variables
|
||||||
|
--Lua functions
|
||||||
|
local match = string.match
|
||||||
|
local strsplit = strsplit
|
||||||
|
local tostring = tostring
|
||||||
|
local format = format
|
||||||
|
local select = select
|
||||||
|
local getn = table.getn
|
||||||
|
--WoW API / Variables
|
||||||
|
local CreateFrame = CreateFrame
|
||||||
|
local IsShiftKeyDown = IsShiftKeyDown
|
||||||
|
local IsAltKeyDown = IsAltKeyDown
|
||||||
|
local IsControlKeyDown = IsControlKeyDown
|
||||||
|
local UnitIsFriend = UnitIsFriend
|
||||||
|
local UnitIsUnit = UnitIsUnit
|
||||||
|
local UnitCanAttack = UnitCanAttack
|
||||||
|
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
|
||||||
|
|
||||||
|
function UF:Construct_AuraBars()
|
||||||
|
local bar = self.statusBar
|
||||||
|
|
||||||
|
E:SetTemplate(self, "Default", nil, nil, UF.thinBorders, true)
|
||||||
|
local inset = UF.thinBorders and E.mult or nil
|
||||||
|
E:SetInside(bar, self, inset, inset)
|
||||||
|
UF["statusbars"][bar] = true
|
||||||
|
UF:Update_StatusBar(bar)
|
||||||
|
|
||||||
|
UF:Configure_FontString(bar.spelltime)
|
||||||
|
UF:Configure_FontString(bar.spellname)
|
||||||
|
UF:Update_FontString(bar.spelltime)
|
||||||
|
UF:Update_FontString(bar.spellname)
|
||||||
|
|
||||||
|
bar.spellname:ClearAllPoints()
|
||||||
|
E:Point(bar.spellname, "LEFT", bar, "LEFT", 2, 0)
|
||||||
|
E:Point(bar.spellname, "RIGHT", bar.spelltime, "LEFT", -4, 0)
|
||||||
|
-- bar.spellname:SetWordWrap(false)
|
||||||
|
|
||||||
|
E:SetTemplate(bar.iconHolder, "Default", nil, nil, UF.thinBorders, true)
|
||||||
|
E:SetInside(bar.icon, bar.iconHolder, inset, inset)
|
||||||
|
bar.icon:SetDrawLayer("OVERLAY")
|
||||||
|
|
||||||
|
bar.bg = bar:CreateTexture(nil, "BORDER")
|
||||||
|
bar.bg:Hide()
|
||||||
|
|
||||||
|
bar.iconHolder:RegisterForClicks("RightButtonUp")
|
||||||
|
bar.iconHolder:SetScript("OnClick", function(self)
|
||||||
|
if E.db.unitframe.auraBlacklistModifier == "NONE" or not ((E.db.unitframe.auraBlacklistModifier == "SHIFT" and IsShiftKeyDown()) or (E.db.unitframe.auraBlacklistModifier == "ALT" and IsAltKeyDown()) or (E.db.unitframe.auraBlacklistModifier == "CTRL" and IsControlKeyDown())) then return; end
|
||||||
|
local auraName = self:GetParent().aura.name
|
||||||
|
|
||||||
|
if auraName then
|
||||||
|
E:Print(format(L["The spell '%s' has been added to the Blacklist unitframe aura filter."], auraName))
|
||||||
|
E.global["unitframe"]["aurafilters"]["Blacklist"]["spells"][auraName] = {
|
||||||
|
["enable"] = true,
|
||||||
|
["priority"] = 0,
|
||||||
|
}
|
||||||
|
UF:Update_AllFrames()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Construct_AuraBarHeader(frame)
|
||||||
|
local auraBar = CreateFrame("Frame", nil, frame)
|
||||||
|
auraBar:SetFrameLevel(frame.RaisedElementParent:GetFrameLevel() + 10) --Make them appear above any text element
|
||||||
|
auraBar.PostCreateBar = UF.Construct_AuraBars
|
||||||
|
auraBar.gap = (-frame.BORDER + frame.SPACING*3)
|
||||||
|
auraBar.spacing = (-frame.BORDER + frame.SPACING*3)
|
||||||
|
auraBar.spark = true
|
||||||
|
auraBar.filter = UF.AuraBarFilter
|
||||||
|
auraBar.PostUpdate = UF.ColorizeAuraBars
|
||||||
|
|
||||||
|
return auraBar
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Configure_AuraBars(frame)
|
||||||
|
if not frame.VARIABLES_SET then return end
|
||||||
|
local auraBars = frame.AuraBars
|
||||||
|
local db = frame.db
|
||||||
|
if db.aurabar.enable then
|
||||||
|
if not frame:IsElementEnabled("AuraBars") then
|
||||||
|
frame:EnableElement("AuraBars")
|
||||||
|
end
|
||||||
|
auraBars:Show()
|
||||||
|
auraBars.friendlyAuraType = db.aurabar.friendlyAuraType
|
||||||
|
auraBars.enemyAuraType = db.aurabar.enemyAuraType
|
||||||
|
auraBars.scaleTime = db.aurabar.uniformThreshold
|
||||||
|
|
||||||
|
local buffColor = self.db.colors.auraBarBuff
|
||||||
|
local debuffColor = self.db.colors.auraBarDebuff
|
||||||
|
local attachTo = frame
|
||||||
|
|
||||||
|
if E:CheckClassColor(buffColor.r, buffColor.g, buffColor.b) then
|
||||||
|
buffColor = E.myclass == "PRIEST" and E.PriestColors or (CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS[E.myclass] or RAID_CLASS_COLORS[E.myclass])
|
||||||
|
end
|
||||||
|
|
||||||
|
if E:CheckClassColor(debuffColor.r, debuffColor.g, debuffColor.b) then
|
||||||
|
debuffColor = E.myclass == "PRIEST" and E.PriestColors or (CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS[E.myclass] or RAID_CLASS_COLORS[E.myclass])
|
||||||
|
end
|
||||||
|
|
||||||
|
if db.aurabar.attachTo == "BUFFS" then
|
||||||
|
attachTo = frame.Buffs
|
||||||
|
elseif db.aurabar.attachTo == "DEBUFFS" then
|
||||||
|
attachTo = frame.Debuffs
|
||||||
|
elseif db.aurabar.attachTo == "PLAYER_AURABARS" and ElvUF_Player then
|
||||||
|
attachTo = ElvUF_Player.AuraBars
|
||||||
|
end
|
||||||
|
|
||||||
|
local anchorPoint, anchorTo = "BOTTOM", "TOP"
|
||||||
|
if db.aurabar.anchorPoint == "BELOW" then
|
||||||
|
anchorPoint, anchorTo = "TOP", "BOTTOM"
|
||||||
|
end
|
||||||
|
|
||||||
|
local yOffset
|
||||||
|
local spacing = (((db.aurabar.attachTo == "FRAME" and 3) or (db.aurabar.attachTo == "PLAYER_AURABARS" and 4) or 2) * frame.SPACING)
|
||||||
|
local border = (((db.aurabar.attachTo == "FRAME" or db.aurabar.attachTo == "PLAYER_AURABARS") and 2 or 1) * frame.BORDER)
|
||||||
|
|
||||||
|
if db.aurabar.anchorPoint == "BELOW" then
|
||||||
|
yOffset = -spacing + border - (not db.aurabar.yOffset and 0 or db.aurabar.yOffset)
|
||||||
|
else
|
||||||
|
yOffset = spacing - border + (not db.aurabar.yOffset and 0 or db.aurabar.yOffset)
|
||||||
|
end
|
||||||
|
|
||||||
|
local xOffset = (db.aurabar.attachTo == "FRAME" and frame.SPACING or 0)
|
||||||
|
local offsetLeft = xOffset + ((db.aurabar.attachTo == "FRAME" and ((anchorTo == "TOP" and frame.ORIENTATION ~= "LEFT") or (anchorTo == "BOTTOM" and frame.ORIENTATION == "LEFT"))) and frame.POWERBAR_OFFSET or 0)
|
||||||
|
local offsetRight = -xOffset - ((db.aurabar.attachTo == "FRAME" and ((anchorTo == "TOP" and frame.ORIENTATION ~= "RIGHT") or (anchorTo == "BOTTOM" and frame.ORIENTATION == "RIGHT"))) and frame.POWERBAR_OFFSET or 0)
|
||||||
|
|
||||||
|
auraBars.auraBarHeight = db.aurabar.height
|
||||||
|
auraBars:ClearAllPoints()
|
||||||
|
E:Point(auraBars, anchorPoint.."LEFT", attachTo, anchorTo.."LEFT", offsetLeft, yOffset)
|
||||||
|
E:Point(auraBars, anchorPoint.."RIGHT", attachTo, anchorTo.."RIGHT", offsetRight, yOffset)
|
||||||
|
auraBars.buffColor = {buffColor.r, buffColor.g, buffColor.b}
|
||||||
|
if UF.db.colors.auraBarByType then
|
||||||
|
auraBars.debuffColor = nil;
|
||||||
|
auraBars.defaultDebuffColor = {debuffColor.r, debuffColor.g, debuffColor.b}
|
||||||
|
else
|
||||||
|
auraBars.debuffColor = {debuffColor.r, debuffColor.g, debuffColor.b}
|
||||||
|
auraBars.defaultDebuffColor = nil;
|
||||||
|
end
|
||||||
|
auraBars.down = db.aurabar.anchorPoint == "BELOW"
|
||||||
|
|
||||||
|
if db.aurabar.sort == "TIME_REMAINING" then
|
||||||
|
auraBars.sort = true --default function
|
||||||
|
elseif db.aurabar.sort == "TIME_REMAINING_REVERSE" then
|
||||||
|
auraBars.sort = self.SortAuraBarReverse
|
||||||
|
elseif db.aurabar.sort == "TIME_DURATION" then
|
||||||
|
auraBars.sort = self.SortAuraBarDuration
|
||||||
|
elseif db.aurabar.sort == "TIME_DURATION_REVERSE" then
|
||||||
|
auraBars.sort = self.SortAuraBarDurationReverse
|
||||||
|
elseif db.aurabar.sort == "NAME" then
|
||||||
|
auraBars.sort = self.SortAuraBarName
|
||||||
|
else
|
||||||
|
auraBars.sort = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
auraBars.maxBars = db.aurabar.maxBars
|
||||||
|
auraBars.forceShow = frame.forceShowAuras
|
||||||
|
-- auraBars:SetAnchors()
|
||||||
|
else
|
||||||
|
if frame:IsElementEnabled("AuraBars") then
|
||||||
|
frame:DisableElement("AuraBars")
|
||||||
|
auraBars:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local huge = math.huge
|
||||||
|
function UF.SortAuraBarReverse(a, b)
|
||||||
|
local compa, compb = a.noTime and huge or a.expirationTime, b.noTime and huge or b.expirationTime
|
||||||
|
return compa < compb
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF.SortAuraBarDuration(a, b)
|
||||||
|
local compa, compb = a.noTime and huge or a.duration, b.noTime and huge or b.duration
|
||||||
|
return compa > compb
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF.SortAuraBarDurationReverse(a, b)
|
||||||
|
local compa, compb = a.noTime and huge or a.duration, b.noTime and huge or b.duration
|
||||||
|
return compa < compb
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF.SortAuraBarName(a, b)
|
||||||
|
return a.name > b.name
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:CheckFilter(name, caster, spellID, isFriend, isPlayer, isUnit, allowDuration, noDuration, canDispell, ...)
|
||||||
|
-- local friendCheck, filterName, filter, filterType, spellList, spell
|
||||||
|
-- for i=1, select("#", ...) do
|
||||||
|
-- filterName = select(i, ...)
|
||||||
|
-- friendCheck = (isFriend and match(filterName, "^Friendly:([^,]*)")) or (not isFriend and match(filterName, "^Enemy:([^,]*)")) or nil
|
||||||
|
-- if friendCheck ~= false then
|
||||||
|
-- if friendCheck ~= nil and (G.unitframe.specialFilters[friendCheck] or E.global.unitframe.aurafilters[friendCheck]) then
|
||||||
|
-- filterName = friendCheck -- this is for our filters to handle Friendly and Enemy
|
||||||
|
-- end
|
||||||
|
-- filter = E.global.unitframe.aurafilters[filterName]
|
||||||
|
-- if filter then
|
||||||
|
-- filterType = filter.type
|
||||||
|
-- spellList = filter.spells
|
||||||
|
-- spell = spellList and (spellList[spellID] or spellList[name])
|
||||||
|
|
||||||
|
-- if filterType and (filterType == "Whitelist") and (spell and spell.enable) and allowDuration then
|
||||||
|
-- return true, spell.priority -- this is the only difference from auarbars code
|
||||||
|
-- elseif filterType and (filterType == "Blacklist") and (spell and spell.enable) then
|
||||||
|
-- return false
|
||||||
|
-- end
|
||||||
|
-- elseif filterName == "Personal" and isPlayer and allowDuration then
|
||||||
|
-- return true
|
||||||
|
-- elseif filterName == "nonPersonal" and (not isPlayer) and allowDuration then
|
||||||
|
-- return true
|
||||||
|
-- elseif filterName == "CastByUnit" and (caster and isUnit) and allowDuration then
|
||||||
|
-- return true
|
||||||
|
-- elseif filterName == "notCastByUnit" and (caster and not isUnit) and allowDuration then
|
||||||
|
-- return true
|
||||||
|
-- elseif filterName == "Dispellable" and canDispell and allowDuration then
|
||||||
|
-- return true
|
||||||
|
-- elseif filterName == "blockNoDuration" and noDuration then
|
||||||
|
-- return false
|
||||||
|
-- elseif filterName == "blockNonPersonal" and (not isPlayer) then
|
||||||
|
-- return false
|
||||||
|
-- end
|
||||||
|
-- end
|
||||||
|
-- end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:AuraBarFilter(unit, name, _, _, _, debuffType, duration, _, unitCaster, isStealable, _, spellID)
|
||||||
|
if not self.db then return end
|
||||||
|
local db = self.db.aurabar
|
||||||
|
|
||||||
|
if not name then return nil end
|
||||||
|
local filterCheck, isUnit, isFriend, isPlayer, canDispell, allowDuration, noDuration
|
||||||
|
|
||||||
|
if db.priority ~= "" then
|
||||||
|
noDuration = (not duration or duration == 0)
|
||||||
|
isFriend = unit and UnitIsFriend("player", unit) and not UnitCanAttack("player", unit)
|
||||||
|
isPlayer = (unitCaster == "player" or unitCaster == "vehicle")
|
||||||
|
isUnit = unit and unitCaster and UnitIsUnit(unit, unitCaster)
|
||||||
|
canDispell = (self.type == "Buffs" and isStealable) or (self.type == "Debuffs" and debuffType and E:IsDispellableByMe(debuffType))
|
||||||
|
allowDuration = noDuration or (duration and (duration > 0) and (db.maxDuration == 0 or duration <= db.maxDuration) and (db.minDuration == 0 or duration >= db.minDuration))
|
||||||
|
filterCheck = UF:CheckFilter(name, unitCaster, spellID, isFriend, isPlayer, isUnit, allowDuration, noDuration, canDispell, strsplit(",", db.priority))
|
||||||
|
else
|
||||||
|
filterCheck = true -- Allow all auras to be shown when the filter list is empty
|
||||||
|
end
|
||||||
|
|
||||||
|
return filterCheck
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:ColorizeAuraBars()
|
||||||
|
local bars = self.bars
|
||||||
|
for index = 1, getn(bars) do
|
||||||
|
local frame = bars[index]
|
||||||
|
if not frame:IsVisible() then break end
|
||||||
|
local spellName = frame.statusBar.aura.name
|
||||||
|
local spellID = frame.statusBar.aura.spellID
|
||||||
|
-- local colors = E.global.unitframe.AuraBarColors[spellID] or E.global.unitframe.AuraBarColors[tostring(spellID)] or E.global.unitframe.AuraBarColors[spellName]
|
||||||
|
|
||||||
|
-- if E.db.unitframe.colors.auraBarTurtle and (E.global.unitframe.aurafilters.TurtleBuffs.spells[spellID] or E.global.unitframe.aurafilters.TurtleBuffs.spells[spellName]) and not colors then
|
||||||
|
-- colors = E.db.unitframe.colors.auraBarTurtleColor
|
||||||
|
-- end
|
||||||
|
|
||||||
|
if colors then
|
||||||
|
frame.statusBar:SetStatusBarColor(colors.r, colors.g, colors.b)
|
||||||
|
frame.statusBar.bg:SetTexture(colors.r * 0.25, colors.g * 0.25, colors.b * 0.25)
|
||||||
|
else
|
||||||
|
local r, g, b = frame.statusBar:GetStatusBarColor()
|
||||||
|
frame.statusBar.bg:SetTexture(r * 0.25, g * 0.25, b * 0.25)
|
||||||
|
end
|
||||||
|
|
||||||
|
if UF.db.colors.transparentAurabars and not frame.statusBar.isTransparent then
|
||||||
|
UF:ToggleTransparentStatusBar(true, frame.statusBar, frame.statusBar.bg, nil, true)
|
||||||
|
elseif(frame.statusBar.isTransparent and not UF.db.colors.transparentAurabars) then
|
||||||
|
UF:ToggleTransparentStatusBar(false, frame.statusBar, frame.statusBar.bg, nil, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
if UF.db.colors.transparentAurabars then
|
||||||
|
local _, _, _, alpha = frame:GetBackdropColor()
|
||||||
|
if colors then
|
||||||
|
frame:SetBackdropColor(colors.r * 0.58, colors.g * 0.58, colors.b * 0.58, alpha)
|
||||||
|
else
|
||||||
|
local r, g, b = frame.statusBar:GetStatusBarColor()
|
||||||
|
frame:SetBackdropColor(r * 0.58, g * 0.58, b * 0.58, alpha)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,573 @@
|
|||||||
|
local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
||||||
|
local UF = E:GetModule("UnitFrames");
|
||||||
|
local LSM = LibStub("LibSharedMedia-3.0");
|
||||||
|
|
||||||
|
--Cache global variables
|
||||||
|
--Lua functions
|
||||||
|
local unpack = unpack
|
||||||
|
local find, format, lower = string.find, string.format, string.lower
|
||||||
|
local strsplit = strsplit
|
||||||
|
local tsort, getn = table.sort, table.getn
|
||||||
|
local ceil = math.ceil
|
||||||
|
--WoW API / Variables
|
||||||
|
local GetTime = GetTime
|
||||||
|
local CreateFrame = CreateFrame
|
||||||
|
local IsShiftKeyDown = IsShiftKeyDown
|
||||||
|
local IsAltKeyDown = IsAltKeyDown
|
||||||
|
local IsControlKeyDown = IsControlKeyDown
|
||||||
|
local UnitCanAttack = UnitCanAttack
|
||||||
|
local UnitIsFriend = UnitIsFriend
|
||||||
|
local UnitIsUnit = UnitIsUnit
|
||||||
|
|
||||||
|
function UF:Construct_Buffs(frame)
|
||||||
|
local buffs = CreateFrame("Frame", frame:GetName().."Buffs", frame)
|
||||||
|
buffs.spacing = E.Spacing
|
||||||
|
buffs.PreSetPosition = (not frame:GetScript("OnUpdate")) and self.SortAuras or nil
|
||||||
|
buffs.PostCreateIcon = self.Construct_AuraIcon
|
||||||
|
buffs.PostUpdateIcon = self.PostUpdateAura
|
||||||
|
--buffs.CustomFilter = self.AuraFilter
|
||||||
|
buffs:SetFrameLevel(frame.RaisedElementParent:GetFrameLevel() + 10) --Make them appear above any text element
|
||||||
|
buffs.type = "buffs"
|
||||||
|
--Set initial width to prevent division by zero. This value doesn't matter, as it will be updated later
|
||||||
|
E:Width(buffs, 100)
|
||||||
|
|
||||||
|
return buffs
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Construct_Debuffs(frame)
|
||||||
|
local debuffs = CreateFrame("Frame", frame:GetName().."Debuffs", frame)
|
||||||
|
debuffs.spacing = E.Spacing
|
||||||
|
debuffs.PreSetPosition = (not frame:GetScript("OnUpdate")) and self.SortAuras or nil
|
||||||
|
debuffs.PostCreateIcon = self.Construct_AuraIcon
|
||||||
|
debuffs.PostUpdateIcon = self.PostUpdateAura
|
||||||
|
--debuffs.CustomFilter = self.AuraFilter
|
||||||
|
debuffs.type = "debuffs"
|
||||||
|
debuffs:SetFrameLevel(frame.RaisedElementParent:GetFrameLevel() + 10) --Make them appear above any text element
|
||||||
|
--Set initial width to prevent division by zero. This value doesn't matter, as it will be updated later
|
||||||
|
E:Width(debuffs, 100)
|
||||||
|
|
||||||
|
return debuffs
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Construct_AuraIcon(button)
|
||||||
|
local offset = UF.thinBorders and E.mult or E.Border
|
||||||
|
|
||||||
|
button.text = button:CreateFontString(nil, "OVERLAY")
|
||||||
|
E:Point(button.text, "CENTER", 1, 1)
|
||||||
|
button.text:SetJustifyH("CENTER")
|
||||||
|
|
||||||
|
E:SetTemplate(button, "Default", nil, nil, UF.thinBorders, true)
|
||||||
|
|
||||||
|
E:SetInside(button.icon, button, offset, offset)
|
||||||
|
button.icon:SetTexCoord(unpack(E.TexCoords))
|
||||||
|
button.icon:SetDrawLayer("ARTWORK")
|
||||||
|
|
||||||
|
button.count:ClearAllPoints()
|
||||||
|
E:Point(button.count, "BOTTOMRIGHT", 1, 1)
|
||||||
|
button.count:SetJustifyH("RIGHT")
|
||||||
|
|
||||||
|
button.overlay:SetTexture(nil)
|
||||||
|
|
||||||
|
button:RegisterForClicks("RightButtonUp")
|
||||||
|
button:SetScript("OnClick", function(self)
|
||||||
|
if E.db.unitframe.auraBlacklistModifier == "NONE"
|
||||||
|
or not ((E.db.unitframe.auraBlacklistModifier == "SHIFT" and IsShiftKeyDown())
|
||||||
|
or (E.db.unitframe.auraBlacklistModifier == "ALT" and IsAltKeyDown())
|
||||||
|
or (E.db.unitframe.auraBlacklistModifier == "CTRL" and IsControlKeyDown())) then return end
|
||||||
|
|
||||||
|
local auraName = self.name
|
||||||
|
|
||||||
|
if auraName then
|
||||||
|
E:Print(format(L["The spell '%s' has been added to the Blacklist unitframe aura filter."], auraName))
|
||||||
|
E.global["unitframe"]["aurafilters"]["Blacklist"]["spells"][auraName] = {
|
||||||
|
["enable"] = true,
|
||||||
|
["priority"] = 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
UF:Update_AllFrames()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
UF:UpdateAuraIconSettings(button, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:EnableDisable_Auras(frame)
|
||||||
|
if frame.db.debuffs.enable or frame.db.buffs.enable then
|
||||||
|
if not frame:IsElementEnabled("Aura") then
|
||||||
|
frame:EnableElement("Aura")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if frame:IsElementEnabled("Aura") then
|
||||||
|
frame:DisableElement("Aura")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function ReverseUpdate(frame)
|
||||||
|
UF:Configure_Auras(frame, "Debuffs")
|
||||||
|
UF:Configure_Auras(frame, "Buffs")
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Configure_Auras(frame, auraType)
|
||||||
|
if not frame.VARIABLES_SET then return end
|
||||||
|
local db = frame.db
|
||||||
|
|
||||||
|
local auras = frame[auraType]
|
||||||
|
auraType = lower(auraType)
|
||||||
|
local rows = db[auraType].numrows
|
||||||
|
|
||||||
|
local totalWidth = frame.UNIT_WIDTH - frame.SPACING*2
|
||||||
|
if frame.USE_POWERBAR_OFFSET then
|
||||||
|
local powerOffset = ((frame.ORIENTATION == "MIDDLE" and 2 or 1) * frame.POWERBAR_OFFSET)
|
||||||
|
|
||||||
|
if not (db[auraType].attachTo == "POWER" and frame.ORIENTATION == "MIDDLE") then
|
||||||
|
totalWidth = totalWidth - powerOffset
|
||||||
|
end
|
||||||
|
end
|
||||||
|
E:Width(auras, totalWidth)
|
||||||
|
|
||||||
|
auras.forceShow = frame.forceShowAuras
|
||||||
|
auras.num = db[auraType].perrow * rows
|
||||||
|
auras.size = db[auraType].sizeOverride ~= 0 and db[auraType].sizeOverride or ((((auras:GetWidth() - (auras.spacing*(auras.num/rows - 1))) / auras.num)) * rows)
|
||||||
|
|
||||||
|
if db[auraType].sizeOverride and db[auraType].sizeOverride > 0 then
|
||||||
|
E:Width(auras, db[auraType].perrow * db[auraType].sizeOverride)
|
||||||
|
end
|
||||||
|
|
||||||
|
local attachTo = self:GetAuraAnchorFrame(frame, db[auraType].attachTo, db.debuffs.attachTo == "BUFFS" and db.buffs.attachTo == "DEBUFFS")
|
||||||
|
--Use frame.SPACING override since it may be different from E.Spacing due to forced thin borders
|
||||||
|
local x, y = E:GetXYOffset(db[auraType].anchorPoint, frame.SPACING)
|
||||||
|
|
||||||
|
if db[auraType].attachTo == "FRAME" then
|
||||||
|
y = 0
|
||||||
|
elseif db[auraType].attachTo == "HEALTH" or db[auraType].attachTo == "POWER" then
|
||||||
|
local newX = E:GetXYOffset(db[auraType].anchorPoint, -frame.BORDER)
|
||||||
|
local _, newY = E:GetXYOffset(db[auraType].anchorPoint, (frame.BORDER + frame.SPACING))
|
||||||
|
x = newX
|
||||||
|
y = newY
|
||||||
|
else
|
||||||
|
x = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
if auraType == "buffs" and frame.Debuffs.attachTo and frame.Debuffs.attachTo == frame.Buffs and db[auraType].attachTo == "DEBUFFS" then
|
||||||
|
--Update Debuffs first, as we would otherwise get conflicting anchor points
|
||||||
|
--This is usually only an issue on profile change
|
||||||
|
ReverseUpdate(frame)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
auras:ClearAllPoints()
|
||||||
|
E:Point(auras, E.InversePoints[db[auraType].anchorPoint], attachTo, db[auraType].anchorPoint, x + db[auraType].xOffset, y + db[auraType].yOffset)
|
||||||
|
E:Height(auras, auras.size * rows)
|
||||||
|
auras["growth-y"] = find(db[auraType].anchorPoint, "TOP") and "UP" or "DOWN"
|
||||||
|
auras["growth-x"] = db[auraType].anchorPoint == "LEFT" and "LEFT" or db[auraType].anchorPoint == "RIGHT" and "RIGHT" or (find(db[auraType].anchorPoint, "LEFT") and "RIGHT" or "LEFT")
|
||||||
|
auras.initialAnchor = E.InversePoints[db[auraType].anchorPoint]
|
||||||
|
|
||||||
|
--These are needed for SmartAuraPosition
|
||||||
|
auras.attachTo = attachTo
|
||||||
|
auras.point = E.InversePoints[db[auraType].anchorPoint]
|
||||||
|
auras.anchorPoint = db[auraType].anchorPoint
|
||||||
|
auras.xOffset = x + db[auraType].xOffset
|
||||||
|
auras.yOffset = y + db[auraType].yOffset
|
||||||
|
|
||||||
|
if db[auraType].enable then
|
||||||
|
auras:Show()
|
||||||
|
UF:UpdateAuraIconSettings(auras)
|
||||||
|
else
|
||||||
|
auras:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
local position = db.smartAuraPosition
|
||||||
|
if position == "BUFFS_ON_DEBUFFS" then
|
||||||
|
if db.debuffs.attachTo == "BUFFS" then
|
||||||
|
E:Print(format(L["This setting caused a conflicting anchor point, where '%s' would be attached to itself. Please check your anchor points. Setting '%s' to be attached to '%s'."], L["Buffs"], L["Debuffs"], L["Frame"]))
|
||||||
|
db.debuffs.attachTo = "FRAME"
|
||||||
|
frame.Debuffs.attachTo = frame
|
||||||
|
end
|
||||||
|
frame.Buffs.PostUpdate = nil
|
||||||
|
frame.Debuffs.PostUpdate = UF.UpdateBuffsHeaderPosition
|
||||||
|
elseif position == "DEBUFFS_ON_BUFFS" then
|
||||||
|
if db.buffs.attachTo == "DEBUFFS" then
|
||||||
|
E:Print(format(L["This setting caused a conflicting anchor point, where '%s' would be attached to itself. Please check your anchor points. Setting '%s' to be attached to '%s'."], L["Debuffs"], L["Buffs"], L["Frame"]))
|
||||||
|
db.buffs.attachTo = "FRAME"
|
||||||
|
frame.Buffs.attachTo = frame
|
||||||
|
end
|
||||||
|
frame.Buffs.PostUpdate = UF.UpdateDebuffsHeaderPosition
|
||||||
|
frame.Debuffs.PostUpdate = nil
|
||||||
|
elseif position == "FLUID_BUFFS_ON_DEBUFFS" then
|
||||||
|
if db.debuffs.attachTo == "BUFFS" then
|
||||||
|
E:Print(format(L["This setting caused a conflicting anchor point, where '%s' would be attached to itself. Please check your anchor points. Setting '%s' to be attached to '%s'."], L["Buffs"], L["Debuffs"], L["Frame"]))
|
||||||
|
db.debuffs.attachTo = "FRAME"
|
||||||
|
frame.Debuffs.attachTo = frame
|
||||||
|
end
|
||||||
|
frame.Buffs.PostUpdate = UF.UpdateBuffsHeight
|
||||||
|
frame.Debuffs.PostUpdate = UF.UpdateBuffsPositionAndDebuffHeight
|
||||||
|
elseif position == "FLUID_DEBUFFS_ON_BUFFS" then
|
||||||
|
if db.buffs.attachTo == "DEBUFFS" then
|
||||||
|
E:Print(format(L["This setting caused a conflicting anchor point, where '%s' would be attached to itself. Please check your anchor points. Setting '%s' to be attached to '%s'."], L["Debuffs"], L["Buffs"], L["Frame"]))
|
||||||
|
db.buffs.attachTo = "FRAME"
|
||||||
|
frame.Buffs.attachTo = frame
|
||||||
|
end
|
||||||
|
frame.Buffs.PostUpdate = UF.UpdateDebuffsPositionAndBuffHeight
|
||||||
|
frame.Debuffs.PostUpdate = UF.UpdateDebuffsHeight
|
||||||
|
else
|
||||||
|
frame.Buffs.PostUpdate = nil
|
||||||
|
frame.Debuffs.PostUpdate = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SortAurasByTime(a, b)
|
||||||
|
if a and b and a:GetParent().db then
|
||||||
|
if a:IsShown() and b:IsShown() then
|
||||||
|
local sortDirection = a:GetParent().db.sortDirection
|
||||||
|
local aTime = a.expiration or -1
|
||||||
|
local bTime = b.expiration or -1
|
||||||
|
if aTime and bTime then
|
||||||
|
if sortDirection == "DESCENDING" then
|
||||||
|
return aTime < bTime
|
||||||
|
else
|
||||||
|
return aTime > bTime
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif a:IsShown() then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SortAurasByName(a, b)
|
||||||
|
if a and b and a:GetParent().db then
|
||||||
|
if a:IsShown() and b:IsShown() then
|
||||||
|
local sortDirection = a:GetParent().db.sortDirection
|
||||||
|
local aName = a.spell or ""
|
||||||
|
local bName = b.spell or ""
|
||||||
|
if aName and bName then
|
||||||
|
if sortDirection == "DESCENDING" then
|
||||||
|
return aName < bName
|
||||||
|
else
|
||||||
|
return aName > bName
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif a:IsShown() then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SortAurasByDuration(a, b)
|
||||||
|
if a and b and a:GetParent().db then
|
||||||
|
if a:IsShown() and b:IsShown() then
|
||||||
|
local sortDirection = a:GetParent().db.sortDirection
|
||||||
|
local aTime = a.duration or -1
|
||||||
|
local bTime = b.duration or -1
|
||||||
|
if aTime and bTime then
|
||||||
|
if sortDirection == "DESCENDING" then
|
||||||
|
return aTime < bTime
|
||||||
|
else
|
||||||
|
return aTime > bTime
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif a:IsShown() then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function SortAurasByCaster(a, b)
|
||||||
|
if a and b and a:GetParent().db then
|
||||||
|
if a:IsShown() and b:IsShown() then
|
||||||
|
local sortDirection = a:GetParent().db.sortDirection
|
||||||
|
local aPlayer = a.isPlayer or false
|
||||||
|
local bPlayer = b.isPlayer or false
|
||||||
|
if sortDirection == "DESCENDING" then
|
||||||
|
return (aPlayer and not bPlayer)
|
||||||
|
else
|
||||||
|
return (not aPlayer and bPlayer)
|
||||||
|
end
|
||||||
|
elseif a:IsShown() then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:SortAuras()
|
||||||
|
--[[if not self.db then return end
|
||||||
|
|
||||||
|
--Sorting by Index is Default
|
||||||
|
if self.db.sortMethod == "TIME_REMAINING" then
|
||||||
|
tsort(self, SortAurasByTime)
|
||||||
|
elseif self.db.sortMethod == "NAME" then
|
||||||
|
tsort(self, SortAurasByName)
|
||||||
|
elseif self.db.sortMethod == "DURATION" then
|
||||||
|
tsort(self, SortAurasByDuration)
|
||||||
|
elseif self.db.sortMethod == "PLAYER" then
|
||||||
|
tsort(self, SortAurasByCaster)
|
||||||
|
end]]
|
||||||
|
|
||||||
|
--Look into possibly applying filter priorities for auras here.
|
||||||
|
|
||||||
|
return 1, getn(self) --from/to range needed for the :SetPosition call in oUF aura element. Without this aura icon position gets all whacky when not sorted by index
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:UpdateAuraIconSettings(auras, noCycle)
|
||||||
|
local frame = auras:GetParent()
|
||||||
|
local type = auras.type
|
||||||
|
if noCycle then
|
||||||
|
frame = auras:GetParent():GetParent()
|
||||||
|
type = auras:GetParent().type
|
||||||
|
end
|
||||||
|
if not frame.db then return end
|
||||||
|
|
||||||
|
local db = frame.db[type]
|
||||||
|
local unitframeFont = LSM:Fetch("font", E.db["unitframe"].font)
|
||||||
|
local unitframeFontOutline = E.db["unitframe"].fontOutline
|
||||||
|
local index = 1
|
||||||
|
auras.db = db
|
||||||
|
if db then
|
||||||
|
if not noCycle then
|
||||||
|
while auras[index] do
|
||||||
|
local button = auras[index]
|
||||||
|
E:FontTemplate(button.text, unitframeFont, db.fontSize, unitframeFontOutline)
|
||||||
|
E:FontTemplate(button.count, unitframeFont, db.countFontSize or db.fontSize, unitframeFontOutline)
|
||||||
|
|
||||||
|
if db.clickThrough and button:IsMouseEnabled() then
|
||||||
|
button:EnableMouse(false)
|
||||||
|
elseif not db.clickThrough and not button:IsMouseEnabled() then
|
||||||
|
button:EnableMouse(true)
|
||||||
|
end
|
||||||
|
index = index + 1
|
||||||
|
end
|
||||||
|
else
|
||||||
|
E:FontTemplate(auras.text, unitframeFont, db.fontSize, unitframeFontOutline)
|
||||||
|
E:FontTemplate(auras.count, unitframeFont, db.countFontSize or db.fontSize, unitframeFontOutline)
|
||||||
|
|
||||||
|
if db.clickThrough and auras:IsMouseEnabled() then
|
||||||
|
auras:EnableMouse(false)
|
||||||
|
elseif not db.clickThrough and not auras:IsMouseEnabled() then
|
||||||
|
auras:EnableMouse(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:PostUpdateAura(unit, button)
|
||||||
|
local auras = button:GetParent()
|
||||||
|
local frame = auras:GetParent()
|
||||||
|
local type = auras.type
|
||||||
|
local db = frame.db and frame.db[type]
|
||||||
|
|
||||||
|
if db then
|
||||||
|
if db.clickThrough and button:IsMouseEnabled() then
|
||||||
|
button:EnableMouse(false)
|
||||||
|
elseif not db.clickThrough and not button:IsMouseEnabled() then
|
||||||
|
button:EnableMouse(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if button.isDebuff then
|
||||||
|
local color = (button.dtype and DebuffTypeColor[button.dtype]) or DebuffTypeColor.none
|
||||||
|
button:SetBackdropBorderColor(color.r * 0.6, color.g * 0.6, color.b * 0.6)
|
||||||
|
end
|
||||||
|
|
||||||
|
local size = button:GetParent().size
|
||||||
|
if size then
|
||||||
|
E:Size(button, size)
|
||||||
|
end
|
||||||
|
|
||||||
|
if button.expiration and button.duration and (button.duration ~= 0) then
|
||||||
|
local getTime = GetTime()
|
||||||
|
if not button:GetScript("OnUpdate") then
|
||||||
|
button.expirationTime = button.expiration
|
||||||
|
button.expirationSaved = button.expiration - getTime
|
||||||
|
button.nextupdate = -1
|
||||||
|
button:SetScript("OnUpdate", UF.UpdateAuraTimer)
|
||||||
|
end
|
||||||
|
if (button.expirationTime ~= button.expiration) or (button.expirationSaved ~= (button.expiration - getTime)) then
|
||||||
|
button.expirationTime = button.expiration
|
||||||
|
button.expirationSaved = button.expiration - getTime
|
||||||
|
button.nextupdate = -1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if button.expiration and button.duration and (button.duration == 0 or button.expiration <= 0) then
|
||||||
|
button.expirationTime = nil
|
||||||
|
button.expirationSaved = nil
|
||||||
|
button:SetScript("OnUpdate", nil)
|
||||||
|
if button.text:GetFont() then
|
||||||
|
button.text:SetText("")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:UpdateAuraTimer(elapsed)
|
||||||
|
self.expirationSaved = self.expirationSaved - elapsed
|
||||||
|
if self.nextupdate > 0 then
|
||||||
|
self.nextupdate = self.nextupdate - elapsed
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if self.expirationSaved <= 0 then
|
||||||
|
self:SetScript("OnUpdate", nil)
|
||||||
|
|
||||||
|
if self.text:GetFont() then
|
||||||
|
self.text:SetText("")
|
||||||
|
end
|
||||||
|
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local timervalue, formatid
|
||||||
|
timervalue, formatid, self.nextupdate = E:GetTimeInfo(self.expirationSaved, 4)
|
||||||
|
if self.text:GetFont() then
|
||||||
|
self.text:SetFormattedText(format("%s%s|r", E.TimeColors[formatid], E.TimeFormats[formatid][2]), timervalue)
|
||||||
|
elseif self:GetParent():GetParent().db then
|
||||||
|
self.text:FontTemplate(LSM:Fetch("font", E.db["unitframe"].font), self:GetParent():GetParent().db[self:GetParent().type].fontSize, E.db["unitframe"].fontOutline)
|
||||||
|
self.text:SetFormattedText(format("%s%s|r", E.TimeColors[formatid], E.TimeFormats[formatid][2]), timervalue)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:AuraFilter(unit, button, texture, count, dispelType, duration, expiration)
|
||||||
|
local db = self:GetParent().db
|
||||||
|
if not db or not db[self.type] then return true end
|
||||||
|
|
||||||
|
db = db[self.type]
|
||||||
|
|
||||||
|
if not name then return nil end
|
||||||
|
local filterCheck, isUnit, isFriend, isPlayer, canDispell, allowDuration, noDuration, spellPriority
|
||||||
|
|
||||||
|
isPlayer = (caster == "player" or caster == "vehicle")
|
||||||
|
isFriend = unit and UnitIsFriend("player", unit) and not UnitCanAttack("player", unit)
|
||||||
|
|
||||||
|
button.isPlayer = isPlayer
|
||||||
|
button.isFriend = isFriend
|
||||||
|
button.isStealable = isStealable
|
||||||
|
button.dtype = dispelType
|
||||||
|
button.duration = duration
|
||||||
|
button.expiration = expiration
|
||||||
|
button.name = name
|
||||||
|
button.owner = caster --what uses this?
|
||||||
|
button.spell = name --what uses this? (SortAurasByName?)
|
||||||
|
button.priority = 0
|
||||||
|
|
||||||
|
noDuration = (not duration or duration == 0)
|
||||||
|
allowDuration = noDuration or (duration and (duration > 0) and (db.maxDuration == 0 or duration <= db.maxDuration) and (db.minDuration == 0 or duration >= db.minDuration))
|
||||||
|
|
||||||
|
if db.priority ~= "" then
|
||||||
|
isUnit = unit and caster and UnitIsUnit(unit, caster)
|
||||||
|
canDispell = (self.type == "buffs" and isStealable) or (self.type == "debuffs" and dispelType and E:IsDispellableByMe(dispelType))
|
||||||
|
filterCheck, spellPriority = UF:CheckFilter(name, caster, spellID, isFriend, isPlayer, isUnit, allowDuration, noDuration, canDispell, strsplit(",", db.priority))
|
||||||
|
if spellPriority then button.priority = spellPriority end -- this is the only difference from auarbars code
|
||||||
|
else
|
||||||
|
filterCheck = allowDuration and true -- Allow all auras to be shown when the filter list is empty, while obeying duration sliders
|
||||||
|
end
|
||||||
|
|
||||||
|
return filterCheck
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:UpdateBuffsHeaderPosition()
|
||||||
|
local parent = self:GetParent()
|
||||||
|
local buffs = parent.Buffs
|
||||||
|
local debuffs = parent.Debuffs
|
||||||
|
local numDebuffs = self.visibleDebuffs
|
||||||
|
|
||||||
|
if numDebuffs == 0 then
|
||||||
|
buffs:ClearAllPoints()
|
||||||
|
E:Point(buffs, debuffs.point, debuffs.attachTo, debuffs.anchorPoint, debuffs.xOffset, debuffs.yOffset)
|
||||||
|
else
|
||||||
|
buffs:ClearAllPoints()
|
||||||
|
E:Point(buffs, buffs.point, buffs.attachTo, buffs.anchorPoint, buffs.xOffset, buffs.yOffset)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:UpdateDebuffsHeaderPosition()
|
||||||
|
local parent = self:GetParent()
|
||||||
|
local debuffs = parent.Debuffs
|
||||||
|
local buffs = parent.Buffs
|
||||||
|
local numBuffs = self.visibleBuffs
|
||||||
|
|
||||||
|
if numBuffs == 0 then
|
||||||
|
debuffs:ClearAllPoints()
|
||||||
|
E:Point(debuffs, buffs.point, buffs.attachTo, buffs.anchorPoint, buffs.xOffset, buffs.yOffset)
|
||||||
|
else
|
||||||
|
debuffs:ClearAllPoints()
|
||||||
|
E:Point(debuffs, debuffs.point, debuffs.attachTo, debuffs.anchorPoint, debuffs.xOffset, debuffs.yOffset)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:UpdateBuffsPositionAndDebuffHeight()
|
||||||
|
local parent = self:GetParent()
|
||||||
|
local db = parent.db
|
||||||
|
local buffs = parent.Buffs
|
||||||
|
local debuffs = parent.Debuffs
|
||||||
|
local numDebuffs = self.visibleDebuffs
|
||||||
|
|
||||||
|
if numDebuffs == 0 then
|
||||||
|
buffs:ClearAllPoints()
|
||||||
|
E:Point(buffs, debuffs.point, debuffs.attachTo, debuffs.anchorPoint, debuffs.xOffset, debuffs.yOffset)
|
||||||
|
else
|
||||||
|
buffs:ClearAllPoints()
|
||||||
|
E:Point(buffs, buffs.point, buffs.attachTo, buffs.anchorPoint, buffs.xOffset, buffs.yOffset)
|
||||||
|
end
|
||||||
|
|
||||||
|
if numDebuffs > 0 then
|
||||||
|
local numRows = ceil(numDebuffs/db.debuffs.perrow)
|
||||||
|
E:Height(debuffs, debuffs.size * (numRows > db.debuffs.numrows and db.debuffs.numrows or numRows))
|
||||||
|
else
|
||||||
|
E:Height(debuffs, debuffs.size)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:UpdateDebuffsPositionAndBuffHeight()
|
||||||
|
local parent = self:GetParent()
|
||||||
|
local db = parent.db
|
||||||
|
local debuffs = parent.Debuffs
|
||||||
|
local buffs = parent.Buffs
|
||||||
|
local numBuffs = self.visibleBuffs
|
||||||
|
|
||||||
|
if numBuffs == 0 then
|
||||||
|
debuffs:ClearAllPoints()
|
||||||
|
E:Point(debuffs, buffs.point, buffs.attachTo, buffs.anchorPoint, buffs.xOffset, buffs.yOffset)
|
||||||
|
else
|
||||||
|
debuffs:ClearAllPoints()
|
||||||
|
E:Point(debuffs, debuffs.point, debuffs.attachTo, debuffs.anchorPoint, debuffs.xOffset, debuffs.yOffset)
|
||||||
|
end
|
||||||
|
|
||||||
|
if numBuffs > 0 then
|
||||||
|
local numRows = ceil(numBuffs/db.buffs.perrow)
|
||||||
|
E:Height(buffs, buffs.size * (numRows > db.buffs.numrows and db.buffs.numrows or numRows))
|
||||||
|
else
|
||||||
|
E:Height(buffs, buffs.size)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:UpdateBuffsHeight()
|
||||||
|
local parent = self:GetParent()
|
||||||
|
local db = parent.db
|
||||||
|
local buffs = parent.Buffs
|
||||||
|
local numBuffs = self.visibleBuffs
|
||||||
|
|
||||||
|
if numBuffs > 0 then
|
||||||
|
local numRows = ceil(numBuffs/db.buffs.perrow)
|
||||||
|
E:Height(buffs, buffs.size * (numRows > db.buffs.numrows and db.buffs.numrows or numRows))
|
||||||
|
else
|
||||||
|
E:Height(buffs, buffs.size)
|
||||||
|
-- Any way to get rid of the last row as well?
|
||||||
|
-- Using buffs:SetHeight(0) makes frames anchored to this one disappear
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:UpdateDebuffsHeight()
|
||||||
|
local parent = self:GetParent()
|
||||||
|
local db = parent.db
|
||||||
|
local debuffs = parent.Debuffs
|
||||||
|
local numDebuffs = self.visibleDebuffs
|
||||||
|
|
||||||
|
if numDebuffs > 0 then
|
||||||
|
local numRows = ceil(numDebuffs/db.debuffs.perrow)
|
||||||
|
E:Height(debuffs, debuffs.size * (numRows > db.debuffs.numrows and db.debuffs.numrows or numRows))
|
||||||
|
else
|
||||||
|
E:Height(debuffs, debuffs.size)
|
||||||
|
-- Any way to get rid of the last row as well?
|
||||||
|
-- Using debuffs:SetHeight(0) makes frames anchored to this one disappear
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,291 @@
|
|||||||
|
local E, L, V, P, G = unpack(ElvUI); --Inport: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
||||||
|
local UF = E:GetModule("UnitFrames");
|
||||||
|
|
||||||
|
--Cache global variables
|
||||||
|
--Lua functions
|
||||||
|
local unpack, tonumber = unpack, tonumber
|
||||||
|
local abs, min = abs, math.min
|
||||||
|
--WoW API / Variables
|
||||||
|
local CreateFrame = CreateFrame
|
||||||
|
local UnitIsPlayer = UnitIsPlayer
|
||||||
|
local UnitClass = UnitClass
|
||||||
|
local UnitReaction = UnitReaction
|
||||||
|
--local UnitCanAttack = UnitCanAttack
|
||||||
|
|
||||||
|
local ns = oUF
|
||||||
|
local ElvUF = ns.oUF
|
||||||
|
|
||||||
|
local INVERT_ANCHORPOINT = {
|
||||||
|
TOPLEFT = "BOTTOMRIGHT",
|
||||||
|
LEFT = "RIGHT",
|
||||||
|
BOTTOMLEFT = "TOPRIGHT",
|
||||||
|
RIGHT = "LEFT",
|
||||||
|
TOPRIGHT = "BOTTOMLEFT",
|
||||||
|
BOTTOMRIGHT = "TOPLEFT",
|
||||||
|
CENTER = "CENTER",
|
||||||
|
TOP = "BOTTOM",
|
||||||
|
BOTTOM = "TOP",
|
||||||
|
}
|
||||||
|
|
||||||
|
function UF:Construct_Castbar(frame, moverName)
|
||||||
|
local castbar = CreateFrame("StatusBar", nil, frame)
|
||||||
|
castbar:SetFrameLevel(frame.RaisedElementParent:GetFrameLevel() + 30) --Make it appear above everything else
|
||||||
|
self["statusbars"][castbar] = true
|
||||||
|
castbar.CustomDelayText = self.CustomCastDelayText
|
||||||
|
castbar.CustomTimeText = self.CustomTimeText
|
||||||
|
castbar.PostCastStart = self.PostCastStart
|
||||||
|
castbar.PostChannelStart = self.PostCastStart
|
||||||
|
castbar:SetClampedToScreen(true)
|
||||||
|
E:CreateBackdrop(castbar, "Default", nil, nil, self.thinBorders, true)
|
||||||
|
|
||||||
|
CreateStatusBarTexturePointer(castbar)
|
||||||
|
|
||||||
|
castbar.Time = castbar:CreateFontString(nil, "OVERLAY")
|
||||||
|
self:Configure_FontString(castbar.Time)
|
||||||
|
castbar.Time:SetPoint("RIGHT", castbar, "RIGHT", -4, 0)
|
||||||
|
castbar.Time:SetTextColor(0.84, 0.75, 0.65)
|
||||||
|
castbar.Time:SetJustifyH("RIGHT")
|
||||||
|
|
||||||
|
castbar.Text = castbar:CreateFontString(nil, "OVERLAY")
|
||||||
|
self:Configure_FontString(castbar.Text)
|
||||||
|
castbar.Text:SetPoint("LEFT", castbar, "LEFT", 4, 0)
|
||||||
|
castbar.Text:SetTextColor(0.84, 0.75, 0.65)
|
||||||
|
castbar.Text:SetJustifyH("LEFT")
|
||||||
|
|
||||||
|
castbar.Spark = castbar:CreateTexture(nil, "OVERLAY")
|
||||||
|
castbar.Spark:SetBlendMode("ADD")
|
||||||
|
castbar.Spark:SetVertexColor(1, 1, 1)
|
||||||
|
|
||||||
|
castbar.bg = castbar:CreateTexture(nil, "BORDER")
|
||||||
|
castbar.bg:Hide()
|
||||||
|
|
||||||
|
local button = CreateFrame("Frame", nil, castbar)
|
||||||
|
local holder = CreateFrame("Frame", nil, castbar)
|
||||||
|
E:SetTemplate(button, "Default", nil, nil, self.thinBorders, true)
|
||||||
|
|
||||||
|
castbar.Holder = holder
|
||||||
|
--these are placeholder so the mover can be created.. it will be changed.
|
||||||
|
castbar.Holder:SetPoint("TOPLEFT", frame, "BOTTOMLEFT", 0, -(frame.BORDER - frame.SPACING))
|
||||||
|
castbar:SetPoint("BOTTOMLEFT", castbar.Holder, "BOTTOMLEFT", frame.BORDER, frame.BORDER)
|
||||||
|
button:SetPoint("RIGHT", castbar, "LEFT", -E.Spacing*3, 0)
|
||||||
|
|
||||||
|
if moverName then
|
||||||
|
E:CreateMover(castbar.Holder, frame:GetName().."CastbarMover", moverName, nil, -6, nil, "ALL,SOLO")
|
||||||
|
end
|
||||||
|
|
||||||
|
local icon = button:CreateTexture(nil, "ARTWORK")
|
||||||
|
local offset = frame.BORDER --use frame.BORDER since it may be different from E.Border due to forced thin borders
|
||||||
|
E:SetInside(icon, nil, offset, offset)
|
||||||
|
icon:SetTexCoord(unpack(E.TexCoords))
|
||||||
|
icon.bg = button
|
||||||
|
|
||||||
|
--Set to castbar.Icon
|
||||||
|
castbar.ButtonIcon = icon
|
||||||
|
|
||||||
|
return castbar
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Configure_Castbar(frame)
|
||||||
|
if not frame.VARIABLES_SET then return end
|
||||||
|
local castbar = frame.Castbar
|
||||||
|
local db = frame.db
|
||||||
|
E:Width(castbar, db.castbar.width - ((frame.BORDER+frame.SPACING)*2))
|
||||||
|
E:Height(castbar, db.castbar.height - ((frame.BORDER+frame.SPACING)*2))
|
||||||
|
E:Width(castbar.Holder, db.castbar.width)
|
||||||
|
E:Height(castbar.Holder, db.castbar.height)
|
||||||
|
if castbar.Holder:GetScript("OnSizeChanged") then
|
||||||
|
castbar.Holder:GetScript("OnSizeChanged")(castbar.Holder)
|
||||||
|
end
|
||||||
|
|
||||||
|
--Icon
|
||||||
|
if db.castbar.icon then
|
||||||
|
castbar.Icon = castbar.ButtonIcon
|
||||||
|
if not db.castbar.iconAttached then
|
||||||
|
E:Size(castbar.Icon.bg, db.castbar.iconSize)
|
||||||
|
else
|
||||||
|
if db.castbar.insideInfoPanel and frame.USE_INFO_PANEL then
|
||||||
|
E:Size(castbar.Icon.bg, db.infoPanel.height - frame.SPACING*2)
|
||||||
|
else
|
||||||
|
E:Size(castbar.Icon.bg, db.castbar.height-frame.SPACING*2)
|
||||||
|
end
|
||||||
|
|
||||||
|
E:Width(castbar, db.castbar.width - castbar.Icon.bg:GetWidth() - (frame.BORDER + frame.SPACING*5))
|
||||||
|
end
|
||||||
|
|
||||||
|
castbar.Icon.bg:Show()
|
||||||
|
else
|
||||||
|
castbar.ButtonIcon.bg:Hide()
|
||||||
|
castbar.Icon = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if db.castbar.spark then
|
||||||
|
castbar.Spark:Show()
|
||||||
|
else
|
||||||
|
castbar.Spark:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
castbar:ClearAllPoints()
|
||||||
|
if db.castbar.insideInfoPanel and frame.USE_INFO_PANEL then
|
||||||
|
if not db.castbar.iconAttached then
|
||||||
|
E:SetInside(castbar, frame.InfoPanel, 0, 0)
|
||||||
|
else
|
||||||
|
local iconWidth = db.castbar.icon and (castbar.Icon.bg:GetWidth() - frame.BORDER) or 0
|
||||||
|
if frame.ORIENTATION == "RIGHT" then
|
||||||
|
castbar:SetPoint("TOPLEFT", frame.InfoPanel, "TOPLEFT")
|
||||||
|
castbar:SetPoint("BOTTOMRIGHT", frame.InfoPanel, "BOTTOMRIGHT", -iconWidth - frame.SPACING*3, 0)
|
||||||
|
else
|
||||||
|
castbar:SetPoint("TOPLEFT", frame.InfoPanel, "TOPLEFT", iconWidth + frame.SPACING*3, 0)
|
||||||
|
castbar:SetPoint("BOTTOMRIGHT", frame.InfoPanel, "BOTTOMRIGHT")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if castbar.Holder.mover then
|
||||||
|
E:DisableMover(castbar.Holder.mover:GetName())
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local isMoved = E:HasMoverBeenMoved(frame:GetName().."CastbarMover") or not castbar.Holder.mover
|
||||||
|
if not isMoved then
|
||||||
|
castbar.Holder.mover:ClearAllPoints()
|
||||||
|
end
|
||||||
|
|
||||||
|
castbar:ClearAllPoints()
|
||||||
|
if frame.ORIENTATION ~= "RIGHT" then
|
||||||
|
E:Point(castbar, "BOTTOMRIGHT", castbar.Holder, "BOTTOMRIGHT", -(frame.BORDER+frame.SPACING), frame.BORDER+frame.SPACING)
|
||||||
|
if not isMoved then
|
||||||
|
E:Point(castbar.Holder.mover, "TOPRIGHT", frame, "BOTTOMRIGHT", 0, -(frame.BORDER - frame.SPACING))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
E:Point(castbar, "BOTTOMLEFT", castbar.Holder, "BOTTOMLEFT", frame.BORDER+frame.SPACING, frame.BORDER+frame.SPACING)
|
||||||
|
if not isMoved then
|
||||||
|
E:Point(castbar.Holder.mover, "TOPLEFT", frame, "BOTTOMLEFT", 0, -(frame.BORDER - frame.SPACING))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if castbar.Holder.mover then
|
||||||
|
E:EnableMover(castbar.Holder.mover:GetName())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not db.castbar.iconAttached and db.castbar.icon then
|
||||||
|
local attachPoint = db.castbar.iconAttachedTo == "Frame" and frame or frame.Castbar
|
||||||
|
local anchorPoint = db.castbar.iconPosition
|
||||||
|
castbar.Icon.bg:ClearAllPoints()
|
||||||
|
E:Point(castbar.Icon.bg, INVERT_ANCHORPOINT[anchorPoint], attachPoint, anchorPoint, db.castbar.iconXOffset, db.castbar.iconYOffset)
|
||||||
|
elseif db.castbar.icon then
|
||||||
|
castbar.Icon.bg:ClearAllPoints()
|
||||||
|
if frame.ORIENTATION == "RIGHT" then
|
||||||
|
E:Point(castbar.Icon.bg, "LEFT", castbar, "RIGHT", frame.SPACING*3, 0)
|
||||||
|
else
|
||||||
|
E:Point(castbar.Icon.bg, "RIGHT", castbar, "LEFT", -frame.SPACING*3, 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if db.castbar.enable and not frame:IsElementEnabled("Castbar") then
|
||||||
|
frame:EnableElement("Castbar")
|
||||||
|
elseif not db.castbar.enable and frame:IsElementEnabled("Castbar") then
|
||||||
|
frame:DisableElement("Castbar")
|
||||||
|
|
||||||
|
if castbar.Holder.mover then
|
||||||
|
E:DisableMover(castbar.Holder.mover:GetName())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:CustomCastDelayText(duration)
|
||||||
|
local db = self:GetParent().db
|
||||||
|
if not db then return end
|
||||||
|
|
||||||
|
if self.channeling then
|
||||||
|
if db.castbar.format == "CURRENT" then
|
||||||
|
self.Time:SetText(format("%.1f |cffaf5050%.1f|r", abs(duration - self.max), self.delay))
|
||||||
|
elseif db.castbar.format == "CURRENTMAX" then
|
||||||
|
self.Time:SetText(format("%.1f / %.1f |cffaf5050%.1f|r", duration, self.max, self.delay))
|
||||||
|
elseif db.castbar.format == "REMAINING" then
|
||||||
|
self.Time:SetText(format("%.1f |cffaf5050%.1f|r", duration, self.delay))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if db.castbar.format == "CURRENT" then
|
||||||
|
self.Time:SetText(format("%.1f |cffaf5050%s %.1f|r", duration, "+", self.delay))
|
||||||
|
elseif db.castbar.format == "CURRENTMAX" then
|
||||||
|
self.Time:SetText(format("%.1f / %.1f |cffaf5050%s %.1f|r", duration, self.max, "+", self.delay))
|
||||||
|
elseif db.castbar.format == "REMAINING" then
|
||||||
|
self.Time:SetText(format("%.1f |cffaf5050%s %.1f|r", abs(duration - self.max), "+", self.delay))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:CustomTimeText(duration)
|
||||||
|
local db = self:GetParent().db
|
||||||
|
if not db then return end
|
||||||
|
|
||||||
|
if self.channeling then
|
||||||
|
if db.castbar.format == "CURRENT" then
|
||||||
|
self.Time:SetText(format("%.1f", abs(duration - self.max)))
|
||||||
|
elseif db.castbar.format == "CURRENTMAX" then
|
||||||
|
self.Time:SetText(format("%.1f / %.1f", duration, self.max))
|
||||||
|
self.Time:SetText(format("%.1f / %.1f", abs(duration - self.max), self.max))
|
||||||
|
elseif db.castbar.format == "REMAINING" then
|
||||||
|
self.Time:SetText(format("%.1f", duration))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if db.castbar.format == "CURRENT" then
|
||||||
|
self.Time:SetText(format("%.1f", duration))
|
||||||
|
elseif db.castbar.format == "CURRENTMAX" then
|
||||||
|
self.Time:SetText(format("%.1f / %.1f", duration, self.max))
|
||||||
|
elseif db.castbar.format == "REMAINING" then
|
||||||
|
self.Time:SetText(format("%.1f", abs(duration - self.max)))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:PostCastStart(name)
|
||||||
|
local db = self:GetParent().db
|
||||||
|
if not db or not db.castbar then return; end
|
||||||
|
|
||||||
|
self.Text:SetText(name)
|
||||||
|
|
||||||
|
-- Get length of Time, then calculate available length for Text
|
||||||
|
local timeWidth = self.Time:GetStringWidth()
|
||||||
|
local textWidth = self:GetWidth() - timeWidth - 10
|
||||||
|
local textStringWidth = self.Text:GetStringWidth()
|
||||||
|
|
||||||
|
if timeWidth == 0 or textStringWidth == 0 then
|
||||||
|
E:Delay(0.05, function() -- Delay may need tweaking
|
||||||
|
textWidth = self:GetWidth() - self.Time:GetStringWidth() - 10
|
||||||
|
textStringWidth = self.Text:GetStringWidth()
|
||||||
|
if textWidth > 0 then self.Text:SetWidth(min(textWidth, textStringWidth)) end
|
||||||
|
end)
|
||||||
|
else
|
||||||
|
self.Text:SetWidth(min(textWidth, textStringWidth))
|
||||||
|
end
|
||||||
|
|
||||||
|
self.Spark:SetHeight(self:GetHeight() * 2)
|
||||||
|
|
||||||
|
local colors = ElvUF.colors
|
||||||
|
local r, g, b = colors.castColor[1], colors.castColor[2], colors.castColor[3]
|
||||||
|
|
||||||
|
local t
|
||||||
|
if UF.db.colors.castClassColor and UnitIsPlayer("player") then
|
||||||
|
local _, class = UnitClass("player")
|
||||||
|
t = ElvUF.colors.class[class]
|
||||||
|
elseif UF.db.colors.castReactionColor and UnitReaction("player", "player") then
|
||||||
|
t = ElvUF.colors.reaction[UnitReaction("player", "player")]
|
||||||
|
end
|
||||||
|
|
||||||
|
if t then
|
||||||
|
r, g, b = t[1], t[2], t[3]
|
||||||
|
end
|
||||||
|
--[[
|
||||||
|
if self.notInterruptible and unit ~= "player" and UnitCanAttack("player", unit) then
|
||||||
|
r, g, b = colors.castNoInterrupt[1], colors.castNoInterrupt[2], colors.castNoInterrupt[3]
|
||||||
|
end
|
||||||
|
]]
|
||||||
|
self:SetStatusBarColor(r, g, b)
|
||||||
|
UF:ToggleTransparentStatusBar(UF.db.colors.transparentCastbar, self, self.bg, nil, true)
|
||||||
|
if self.bg:IsShown() then
|
||||||
|
self.bg:SetTexture(r * 0.25, g * 0.25, b * 0.25)
|
||||||
|
|
||||||
|
local _, _, _, alpha = self.backdrop:GetBackdropColor()
|
||||||
|
self.backdrop:SetBackdropColor(r * 0.58, g * 0.58, b * 0.58, alpha)
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,461 @@
|
|||||||
|
local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
||||||
|
local UF = E:GetModule("UnitFrames");
|
||||||
|
|
||||||
|
local _G = _G
|
||||||
|
local pairs = pairs
|
||||||
|
local select = select
|
||||||
|
local assert = assert
|
||||||
|
local tinsert = table.insert
|
||||||
|
|
||||||
|
local CreateFrame = CreateFrame
|
||||||
|
local UnitIsUnit = UnitIsUnit
|
||||||
|
local UnitReaction = UnitReaction
|
||||||
|
local UnitIsPlayer = UnitIsPlayer
|
||||||
|
local UnitClass = UnitClass
|
||||||
|
local UnitExists = UnitExists
|
||||||
|
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
|
||||||
|
local FACTION_BAR_COLORS = FACTION_BAR_COLORS
|
||||||
|
|
||||||
|
function UF:FrameGlow_MouseOnUnit(frame)
|
||||||
|
if frame and frame:IsVisible() and UnitExists("mouseover") then
|
||||||
|
local unit = frame.unit or (frame.isForced and "player")
|
||||||
|
return unit and UnitIsUnit("mouseover", unit)
|
||||||
|
elseif frame.isHighlight then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_ElementHook(frame, glow, which)
|
||||||
|
if not (frame and frame.__elements) then return end
|
||||||
|
tinsert(frame.__elements, function()
|
||||||
|
local unit = frame.unit or (frame.isForced and "player")
|
||||||
|
if unit then
|
||||||
|
UF:FrameGlow_SetGlowColor(glow, unit, which)
|
||||||
|
end
|
||||||
|
|
||||||
|
if which == "mouseoverGlow" then
|
||||||
|
UF:FrameGlow_PositionHighlight(frame)
|
||||||
|
UF:FrameGlow_CheckMouseover(frame)
|
||||||
|
else
|
||||||
|
UF:FrameGlow_PositionGlow(frame, glow, glow.powerGlow)
|
||||||
|
end
|
||||||
|
|
||||||
|
if which == "targetGlow" then
|
||||||
|
UF:FrameGlow_CheckTarget(frame)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_HookPowerBar(frame, power, powerName, glow, offset)
|
||||||
|
if (frame and power and powerName and glow and offset) and not glow[powerName.."Hooked"] then
|
||||||
|
glow[powerName.."Hooked"] = true
|
||||||
|
local func = function() UF:FrameGlow_ClassGlowPosition(frame, powerName, glow, offset, true) end
|
||||||
|
HookScript(power, "OnShow", func)
|
||||||
|
HookScript(power, "OnHide", func)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_ClassGlowPosition(frame, powerName, glow, offset, fromScript)
|
||||||
|
if not (frame and glow and offset) then return end
|
||||||
|
|
||||||
|
local power = powerName and frame[powerName]
|
||||||
|
if not power then return end
|
||||||
|
|
||||||
|
if not fromScript then
|
||||||
|
UF:FrameGlow_HookPowerBar(frame, power, powerName, glow, offset)
|
||||||
|
end
|
||||||
|
|
||||||
|
local portrait = (frame.USE_PORTRAIT and not frame.PORTRAIT_WIDTH == 0) and (frame.Portrait and frame.Portrait.backdrop)
|
||||||
|
|
||||||
|
if powerName == "HappinessIndicator" and (power and power.backdrop and power:IsVisible()) then
|
||||||
|
if frame.ORIENTATION == "RIGHT" then
|
||||||
|
glow:SetPoint("TOPLEFT", power.backdrop, -offset, offset)
|
||||||
|
glow:SetPoint("TOPRIGHT", portrait or frame.Health.backdrop, offset, offset)
|
||||||
|
else
|
||||||
|
glow:SetPoint("TOPLEFT", portrait or frame.Health.backdrop, -offset, offset)
|
||||||
|
glow:SetPoint("TOPRIGHT", power.backdrop, offset, offset)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if (power and power.backdrop and power:IsVisible()) and (not (frame.CLASSBAR_DETACHED or frame.USE_MINI_CLASSBAR)) then
|
||||||
|
if frame.ORIENTATION == "RIGHT" then
|
||||||
|
glow:SetPoint("TOPLEFT", power.backdrop, -offset, offset)
|
||||||
|
glow:SetPoint("TOPRIGHT", portrait or power.backdrop, offset, offset)
|
||||||
|
else
|
||||||
|
glow:SetPoint("TOPLEFT", portrait or power.backdrop, -offset, offset)
|
||||||
|
glow:SetPoint("TOPRIGHT", power.backdrop, offset, offset)
|
||||||
|
end
|
||||||
|
elseif frame.Health and frame.Health.backdrop then
|
||||||
|
if frame.ORIENTATION == "RIGHT" then
|
||||||
|
glow:SetPoint("TOPLEFT", frame.Health.backdrop, -offset, offset)
|
||||||
|
glow:SetPoint("TOPRIGHT", portrait or frame.Health.backdrop, offset, offset)
|
||||||
|
else
|
||||||
|
glow:SetPoint("TOPLEFT", portrait or frame.Health.backdrop, -offset, offset)
|
||||||
|
glow:SetPoint("TOPRIGHT", frame.Health.backdrop, offset, offset)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_PositionGlow(frame, mainGlow, powerGlow)
|
||||||
|
if not (frame and frame.VARIABLES_SET) then return end
|
||||||
|
|
||||||
|
local infoPanel = frame.InfoPanel
|
||||||
|
local additionalPower = frame.AdditionalPower
|
||||||
|
local runes = frame.Runes
|
||||||
|
local comboPoints = frame.ComboPoints
|
||||||
|
local happiness = frame.HappinessIndicator
|
||||||
|
local power = frame.Power and frame.Power.backdrop
|
||||||
|
local health = frame.Health and frame.Health.backdrop
|
||||||
|
local portrait = (frame.USE_PORTRAIT and not frame.PORTRAIT_WIDTH ~= 0) and (frame.Portrait and frame.Portrait.backdrop)
|
||||||
|
local offset = (E.PixelMode and E.mult*3) or E.mult*4 -- edgeSize is 3
|
||||||
|
|
||||||
|
mainGlow:ClearAllPoints()
|
||||||
|
if frame.ORIENTATION == "RIGHT" then
|
||||||
|
mainGlow:SetPoint("TOPLEFT", health, -offset, offset)
|
||||||
|
mainGlow:SetPoint("TOPRIGHT", portrait or health, offset, offset)
|
||||||
|
else
|
||||||
|
mainGlow:SetPoint("TOPLEFT", portrait or health, -offset, offset)
|
||||||
|
mainGlow:SetPoint("TOPRIGHT", health, offset, offset)
|
||||||
|
end
|
||||||
|
|
||||||
|
if frame.USE_POWERBAR_OFFSET or frame.USE_MINI_POWERBAR then
|
||||||
|
mainGlow:SetPoint("BOTTOMLEFT", health, -offset, -offset)
|
||||||
|
mainGlow:SetPoint("BOTTOMRIGHT", health, offset, -offset)
|
||||||
|
else
|
||||||
|
--offset is set because its one pixel off for some reason
|
||||||
|
mainGlow:SetPoint("BOTTOMLEFT", frame, -offset, -(E.PixelMode and offset or offset-1))
|
||||||
|
mainGlow:SetPoint("BOTTOMRIGHT", frame, offset, -(E.PixelMode and offset or offset-1))
|
||||||
|
end
|
||||||
|
|
||||||
|
if powerGlow then
|
||||||
|
powerGlow:ClearAllPoints()
|
||||||
|
powerGlow:SetPoint("TOPLEFT", power, -offset, offset)
|
||||||
|
powerGlow:SetPoint("TOPRIGHT", power, offset, offset)
|
||||||
|
powerGlow:SetPoint("BOTTOMLEFT", power, -offset, -offset)
|
||||||
|
powerGlow:SetPoint("BOTTOMRIGHT", power, offset, -offset)
|
||||||
|
end
|
||||||
|
|
||||||
|
if additionalPower then
|
||||||
|
UF:FrameGlow_ClassGlowPosition(frame, "AdditionalPower", mainGlow, offset)
|
||||||
|
elseif runes then
|
||||||
|
UF:FrameGlow_ClassGlowPosition(frame, "Runes", mainGlow, offset)
|
||||||
|
elseif comboPoints then
|
||||||
|
UF:FrameGlow_ClassGlowPosition(frame, "ComboPoints", mainGlow, offset)
|
||||||
|
elseif happiness then
|
||||||
|
UF:FrameGlow_ClassGlowPosition(frame, "HappinessIndicator", mainGlow, offset)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_CreateGlow(frame, mouse)
|
||||||
|
-- Main Glow to wrap the health frame to it's best ability
|
||||||
|
E:CreateShadow(frame, "Default")
|
||||||
|
local mainGlow = frame.shadow
|
||||||
|
mainGlow:SetFrameStrata("BACKGROUND")
|
||||||
|
mainGlow:Hide()
|
||||||
|
frame.shadow = nil
|
||||||
|
|
||||||
|
-- Secondary Glow for power frame when using power offset or mini power
|
||||||
|
E:CreateShadow(frame, "Default")
|
||||||
|
local powerGlow = frame.shadow
|
||||||
|
powerGlow:SetFrameStrata("BACKGROUND")
|
||||||
|
powerGlow:Hide()
|
||||||
|
frame.shadow = nil
|
||||||
|
|
||||||
|
if mouse then
|
||||||
|
mainGlow:SetFrameLevel(4)
|
||||||
|
powerGlow:SetFrameLevel(4)
|
||||||
|
else
|
||||||
|
mainGlow:SetFrameLevel(3)
|
||||||
|
powerGlow:SetFrameLevel(3)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Eventing Frame
|
||||||
|
if not frame.Highlight then
|
||||||
|
frame.Highlight = CreateFrame("Frame", nil, frame)
|
||||||
|
frame.Highlight:Hide()
|
||||||
|
HookScript(frame, "OnEnter", function()
|
||||||
|
frame.isHighlight = true
|
||||||
|
UF:FrameGlow_CheckMouseover(frame)
|
||||||
|
end)
|
||||||
|
HookScript(frame, "OnLeave", function()
|
||||||
|
frame.isHighlight = false
|
||||||
|
UF:FrameGlow_CheckMouseover(frame)
|
||||||
|
end)
|
||||||
|
|
||||||
|
HookScript(frame.Highlight, "OnEvent", function()
|
||||||
|
if event == "UPDATE_MOUSEOVER_UNIT" then
|
||||||
|
UF:FrameGlow_CheckMouseover(frame)
|
||||||
|
elseif event == "PLAYER_TARGET_CHANGED" then
|
||||||
|
UF:FrameGlow_CheckTarget(frame)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
mainGlow.powerGlow = powerGlow
|
||||||
|
return mainGlow
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_SetGlowColor(glow, unit, which)
|
||||||
|
if not glow then return end
|
||||||
|
local option = E.db.unitframe.colors.frameGlow[which]
|
||||||
|
local r, g, b, a = 1, 1, 1, 1
|
||||||
|
|
||||||
|
if option.color then
|
||||||
|
local color = option.color
|
||||||
|
r, g, b, a = color.r, color.g, color.b, color.a
|
||||||
|
end
|
||||||
|
|
||||||
|
if option.class then
|
||||||
|
local isPlayer = unit and UnitIsPlayer(unit)
|
||||||
|
local reaction = unit and UnitReaction(unit, "player")
|
||||||
|
|
||||||
|
if isPlayer then
|
||||||
|
local _, class = UnitClass(unit)
|
||||||
|
if class then
|
||||||
|
local color = CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS[class] or RAID_CLASS_COLORS[class]
|
||||||
|
if color then
|
||||||
|
r, g, b = color.r, color.g, color.b
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif reaction then
|
||||||
|
local color = FACTION_BAR_COLORS[reaction]
|
||||||
|
if color then
|
||||||
|
r, g, b = color.r, color.g, color.b
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if which == "mouseoverGlow" then
|
||||||
|
glow:SetVertexColor(r, g, b, a)
|
||||||
|
else
|
||||||
|
glow:SetBackdropBorderColor(r, g, b, a)
|
||||||
|
if glow.powerGlow then
|
||||||
|
glow.powerGlow:SetBackdropBorderColor(r, g, b, a)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_HideGlow(glow)
|
||||||
|
if not glow then return end
|
||||||
|
if glow:IsShown() then glow:Hide() end
|
||||||
|
if glow.powerGlow and glow.powerGlow:IsShown() then
|
||||||
|
glow.powerGlow:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_ConfigureGlow(frame, unit, dbTexture)
|
||||||
|
if not frame then return end
|
||||||
|
|
||||||
|
if not unit then
|
||||||
|
unit = frame.unit or (frame.isForced and "player")
|
||||||
|
end
|
||||||
|
|
||||||
|
local shouldHide
|
||||||
|
if frame.Highlight and frame.Highlight.texture then
|
||||||
|
if E.db.unitframe.colors.frameGlow.mouseoverGlow.enable and not (frame.db and frame.db.disableMouseoverGlow) then
|
||||||
|
frame.Highlight.texture:SetTexture(dbTexture)
|
||||||
|
UF:FrameGlow_SetGlowColor(frame.Highlight.texture, unit, "mouseoverGlow")
|
||||||
|
else
|
||||||
|
shouldHide = "texture"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if frame.MouseGlow then
|
||||||
|
if E.db.unitframe.colors.frameGlow.mainGlow.enable and not (frame.db and frame.db.disableMouseoverGlow) then
|
||||||
|
UF:FrameGlow_SetGlowColor(frame.MouseGlow, unit, "mainGlow")
|
||||||
|
else
|
||||||
|
UF:FrameGlow_HideGlow(frame.MouseGlow)
|
||||||
|
if shouldHide then
|
||||||
|
shouldHide = "both"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if shouldHide then
|
||||||
|
if shouldHide == "both" and frame.Highlight:IsShown() then
|
||||||
|
frame.Highlight:Hide()
|
||||||
|
elseif shouldHide == "texture" then
|
||||||
|
frame.Highlight.texture:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if frame.TargetGlow then
|
||||||
|
UF:FrameGlow_CheckTarget(frame, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_CheckTarget(frame, setColor)
|
||||||
|
if not (frame and frame.TargetGlow and frame:IsVisible()) then return end
|
||||||
|
|
||||||
|
local unit = frame.unit or (frame.isForced and "player")
|
||||||
|
if E.db.unitframe.colors.frameGlow.targetGlow.enable and (unit and UnitIsUnit(unit, "target")) and not (frame.db and frame.db.disableTargetGlow) then
|
||||||
|
if setColor then
|
||||||
|
UF:FrameGlow_SetGlowColor(frame.TargetGlow, unit, "targetGlow")
|
||||||
|
end
|
||||||
|
if frame.TargetGlow.powerGlow then
|
||||||
|
if frame.USE_POWERBAR_OFFSET or frame.USE_MINI_POWERBAR then
|
||||||
|
frame.TargetGlow.powerGlow:Show()
|
||||||
|
elseif frame.TargetGlow.powerGlow:IsShown() then
|
||||||
|
frame.TargetGlow.powerGlow:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
frame.TargetGlow:Show()
|
||||||
|
else
|
||||||
|
UF:FrameGlow_HideGlow(frame.TargetGlow)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_CheckMouseover(frame, onEnter)
|
||||||
|
if not (frame and frame.MouseGlow and frame:IsVisible()) then return end
|
||||||
|
|
||||||
|
local shouldShow
|
||||||
|
if UF:FrameGlow_MouseOnUnit(frame, onEnter) then
|
||||||
|
if E.db.unitframe.colors.frameGlow.mainGlow.enable and not (frame.db and frame.db.disableMouseoverGlow) then
|
||||||
|
shouldShow = "frame"
|
||||||
|
end
|
||||||
|
if E.db.unitframe.colors.frameGlow.mouseoverGlow.enable and not (frame.db and frame.db.disableMouseoverGlow) then
|
||||||
|
shouldShow = (shouldShow and "both") or "texture"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if shouldShow then
|
||||||
|
if frame.Highlight and not frame.Highlight:IsShown() then
|
||||||
|
frame.Highlight:Show()
|
||||||
|
end
|
||||||
|
if (shouldShow == "both" or shouldShow == "frame") then
|
||||||
|
if frame.MouseGlow.powerGlow then
|
||||||
|
if frame.USE_POWERBAR_OFFSET or frame.USE_MINI_POWERBAR then
|
||||||
|
frame.MouseGlow.powerGlow:Show()
|
||||||
|
elseif frame.MouseGlow.powerGlow:IsShown() then
|
||||||
|
frame.MouseGlow.powerGlow:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
frame.MouseGlow:Show()
|
||||||
|
|
||||||
|
if (shouldShow == "frame") and frame.Highlight.texture and frame.Highlight.texture:IsShown() then
|
||||||
|
frame.Highlight.texture:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if (shouldShow == "both" or shouldShow == "texture") and frame.Highlight.texture and not frame.Highlight.texture:IsShown() then
|
||||||
|
frame.Highlight.texture:Show()
|
||||||
|
end
|
||||||
|
elseif frame.Highlight and frame.Highlight:IsShown() then
|
||||||
|
frame.Highlight:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_PositionHighlight(frame)
|
||||||
|
if frame.Highlight and frame.Highlight.texture then
|
||||||
|
frame.Highlight.texture:ClearAllPoints()
|
||||||
|
frame.Highlight.texture:SetPoint("TOPLEFT", frame.Health, "TOPLEFT")
|
||||||
|
frame.Highlight.texture:SetPoint("BOTTOMRIGHT", frame.Health.texturePointer, "BOTTOMRIGHT")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Configure_HighlightGlow(frame)
|
||||||
|
if frame.Highlight and frame.Highlight.texture then
|
||||||
|
local dbTexture = UF.LSM:Fetch("statusbar", E.db.unitframe.colors.frameGlow.mouseoverGlow.texture)
|
||||||
|
frame.Highlight.texture:SetTexture(dbTexture)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Construct_HighlightGlow(frame, glow)
|
||||||
|
if frame.Health and frame.Highlight then
|
||||||
|
HookScript(frame.Highlight, "OnHide", function()
|
||||||
|
UF:FrameGlow_HideGlow(glow)
|
||||||
|
|
||||||
|
if this.texture and this.texture:IsShown() then
|
||||||
|
this.texture:Hide()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
frame.Highlight:Show()
|
||||||
|
frame.Highlight:SetScript("OnUpdate", function()
|
||||||
|
if this.elapsed and this.elapsed > 0.1 then
|
||||||
|
if not UF:FrameGlow_MouseOnUnit(frame) then
|
||||||
|
this:Hide()
|
||||||
|
end
|
||||||
|
this.elapsed = 0
|
||||||
|
else
|
||||||
|
this.elapsed = (this.elapsed or 0) + arg1
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
frame.Highlight.texture = frame.Health:CreateTexture("$parentHighlight", "OVERLAY")
|
||||||
|
frame.Highlight.texture:Hide()
|
||||||
|
|
||||||
|
UF:FrameGlow_ElementHook(frame, frame.Highlight.texture, "mouseoverGlow")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Construct_MouseGlow(frame)
|
||||||
|
local mainGlow = UF:FrameGlow_CreateGlow(frame, true)
|
||||||
|
UF:FrameGlow_ElementHook(frame, mainGlow, "mainGlow")
|
||||||
|
UF:Construct_HighlightGlow(frame, mainGlow)
|
||||||
|
frame.Highlight:RegisterEvent("UPDATE_MOUSEOVER_UNIT")
|
||||||
|
|
||||||
|
return mainGlow
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Construct_TargetGlow(frame)
|
||||||
|
local targetGlow = UF:FrameGlow_CreateGlow(frame)
|
||||||
|
UF:FrameGlow_ElementHook(frame, targetGlow, "targetGlow")
|
||||||
|
frame.Highlight:RegisterEvent("PLAYER_TARGET_CHANGED")
|
||||||
|
|
||||||
|
return targetGlow
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_CheckChildren(frame, dbTexture)
|
||||||
|
if frame.GetName then
|
||||||
|
local pet = _G[frame:GetName().."Pet"]
|
||||||
|
if pet then
|
||||||
|
UF:FrameGlow_ConfigureGlow(pet, pet.unit, dbTexture)
|
||||||
|
end
|
||||||
|
|
||||||
|
local target = _G[frame:GetName().."Target"]
|
||||||
|
if target then
|
||||||
|
UF:FrameGlow_ConfigureGlow(target, target.unit, dbTexture)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:FrameGlow_UpdateFrames()
|
||||||
|
local dbTexture = UF.LSM:Fetch("statusbar", E.db.unitframe.colors.frameGlow.mouseoverGlow.texture)
|
||||||
|
|
||||||
|
-- focus, focustarget, pet, pettarget, player, target, targettarget, targettargettarget
|
||||||
|
for unit in pairs(self.units) do
|
||||||
|
UF:FrameGlow_ConfigureGlow(self[unit], unit, dbTexture)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- arena{1-5}, boss{1-5}
|
||||||
|
for unit in pairs(self.groupunits) do
|
||||||
|
UF:FrameGlow_ConfigureGlow(self[unit], unit, dbTexture)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- assist, tank, party, raid, raid40, raidpet
|
||||||
|
for groupName in pairs(self.headers) do
|
||||||
|
assert(self[groupName], "UF FrameGlow: Invalid group specified.")
|
||||||
|
local group = self[groupName]
|
||||||
|
|
||||||
|
if group.GetNumChildren then
|
||||||
|
for i = 1, group:GetNumChildren() do
|
||||||
|
local frame = select(i, group:GetChildren())
|
||||||
|
if frame and frame.Health then
|
||||||
|
UF:FrameGlow_ConfigureGlow(frame, frame.unit, dbTexture)
|
||||||
|
UF:FrameGlow_CheckChildren(frame, dbTexture)
|
||||||
|
elseif frame then
|
||||||
|
for n = 1, frame:GetNumChildren() do
|
||||||
|
local child = select(n, frame:GetChildren())
|
||||||
|
if child and child.Health then
|
||||||
|
UF:FrameGlow_ConfigureGlow(child, child.unit, dbTexture)
|
||||||
|
UF:FrameGlow_CheckChildren(child, dbTexture)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
||||||
|
local UF = E:GetModule("UnitFrames");
|
||||||
|
|
||||||
|
--Cache global variables
|
||||||
|
--Lua functions
|
||||||
|
|
||||||
|
--WoW API / Variables
|
||||||
|
local CreateFrame = CreateFrame
|
||||||
|
|
||||||
|
function UF:Construct_GPS(frame)
|
||||||
|
local gps = CreateFrame("Frame", nil, frame)
|
||||||
|
gps:SetFrameLevel(frame:GetFrameLevel() + 50)
|
||||||
|
gps:Hide()
|
||||||
|
|
||||||
|
gps.Texture = gps:CreateTexture("OVERLAY")
|
||||||
|
gps.Texture:SetTexture([[Interface\AddOns\ElvUI\media\textures\arrow.tga]])
|
||||||
|
gps.Texture:SetBlendMode("BLEND")
|
||||||
|
gps.Texture:SetVertexColor(214/255, 41/255, 41/255)
|
||||||
|
gps.Texture:SetAllPoints()
|
||||||
|
|
||||||
|
return gps
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Configure_GPS(frame)
|
||||||
|
local GPS = frame.GPS
|
||||||
|
if frame.db.GPSArrow.enable then
|
||||||
|
if not frame:IsElementEnabled("GPS") then
|
||||||
|
frame:EnableElement("GPS")
|
||||||
|
end
|
||||||
|
|
||||||
|
E:Size(GPS, frame.db.GPSArrow.size)
|
||||||
|
GPS.onMouseOver = frame.db.GPSArrow.onMouseOver
|
||||||
|
GPS.outOfRange = frame.db.GPSArrow.outOfRange
|
||||||
|
|
||||||
|
E:Point(GPS, "CENTER", frame, "CENTER", frame.db.GPSArrow.xOffset, frame.db.GPSArrow.yOffset)
|
||||||
|
else
|
||||||
|
if frame:IsElementEnabled("GPS") then
|
||||||
|
frame:DisableElement("GPS")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -176,6 +176,9 @@ function UF:Configure_HealthBar(frame)
|
|||||||
--Transparency Settings
|
--Transparency Settings
|
||||||
UF:ToggleTransparentStatusBar(UF.db.colors.transparentHealth, frame.Health, frame.Health.bg, (frame.USE_PORTRAIT and frame.USE_PORTRAIT_OVERLAY) ~= true)
|
UF:ToggleTransparentStatusBar(UF.db.colors.transparentHealth, frame.Health, frame.Health.bg, (frame.USE_PORTRAIT and frame.USE_PORTRAIT_OVERLAY) ~= true)
|
||||||
|
|
||||||
|
--Highlight Texture
|
||||||
|
UF:Configure_HighlightGlow(frame)
|
||||||
|
|
||||||
frame:UpdateElement("Health")
|
frame:UpdateElement("Health")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,17 @@
|
|||||||
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
|
<Script file="AuraBars.lua"/>
|
||||||
|
<Script file="Auras.lua"/>
|
||||||
|
<Script file="Castbar.lua"/>
|
||||||
<Script file="CombatIndicator.lua"/>
|
<Script file="CombatIndicator.lua"/>
|
||||||
|
<Script file="GPS.lua"/>
|
||||||
<Script file="Health.lua"/>
|
<Script file="Health.lua"/>
|
||||||
<Script file="Name.lua"/>
|
<Script file="Name.lua"/>
|
||||||
<Script file="Portrait.lua"/>
|
<Script file="Portrait.lua"/>
|
||||||
<Script file="Power.lua"/>
|
<Script file="Power.lua"/>
|
||||||
<Script file="InfoPanel.lua"/>
|
<Script file="InfoPanel.lua"/>
|
||||||
|
<Script file="PvPIndicator.lua"/>
|
||||||
<Script file="RaidIcon.lua"/>
|
<Script file="RaidIcon.lua"/>
|
||||||
<Script file="RaidRoleIcons.lua"/>
|
<Script file="RaidRoleIcons.lua"/>
|
||||||
<Script file="RestingIndicator.lua"/>
|
<Script file="RestingIndicator.lua"/>
|
||||||
|
<Script file="FrameGlow.lua"/>
|
||||||
</Ui>
|
</Ui>
|
||||||
@@ -54,11 +54,11 @@ function UF:Configure_Portrait(frame, dontHide)
|
|||||||
portrait:SetParent(frame.Health);
|
portrait:SetParent(frame.Health);
|
||||||
end
|
end
|
||||||
|
|
||||||
portrait:SetAllPoints(frame.Health);
|
--portrait:SetAllPoints(frame.Health);
|
||||||
|
portrait:SetWidth(frame.Health:GetWidth())
|
||||||
|
portrait:SetHeight(frame.Health:GetHeight())
|
||||||
|
portrait:SetPoint("TOPLEFT", frame.Health, "TOPLEFT", 0, -frame.BORDER)
|
||||||
|
|
||||||
portrait:SetPoint("TOPLEFT", frame.Health, "TOPLEFT", - frame.BORDER - frame.SPACING, -(frame.BORDER + frame.SPACING))
|
|
||||||
portrait:SetPoint("BOTTOMLEFT", frame.Health, "BOTTOMLEFT", - frame.BORDER - frame.SPACING, -(frame.BORDER + frame.SPACING))
|
|
||||||
|
|
||||||
portrait:SetAlpha(0.35);
|
portrait:SetAlpha(0.35);
|
||||||
if(not dontHide) then
|
if(not dontHide) then
|
||||||
portrait:Show();
|
portrait:Show();
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
||||||
|
local UF = E:GetModule("UnitFrames");
|
||||||
|
|
||||||
|
--Cache global variables
|
||||||
|
--Lua functions
|
||||||
|
|
||||||
|
--WoW API / Variables
|
||||||
|
|
||||||
|
function UF:Construct_PvPIndicator(frame)
|
||||||
|
local pvp = frame.RaisedElementParent:CreateFontString(nil, "OVERLAY")
|
||||||
|
UF:Configure_FontString(pvp)
|
||||||
|
|
||||||
|
return pvp
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Configure_PVPIndicator(frame)
|
||||||
|
local pvp = frame.PvPText
|
||||||
|
local x, y = self:GetPositionOffset(frame.db.pvp.position)
|
||||||
|
pvp:ClearAllPoints()
|
||||||
|
E:Point(pvp, frame.db.pvp.position, frame.Health, frame.db.pvp.position, x, y)
|
||||||
|
|
||||||
|
frame:Tag(pvp, frame.db.pvp.text_format)
|
||||||
|
end
|
||||||
@@ -5,9 +5,6 @@ local _G = _G
|
|||||||
local tinsert = table.insert
|
local tinsert = table.insert
|
||||||
|
|
||||||
local CreateFrame = CreateFrame
|
local CreateFrame = CreateFrame
|
||||||
local InCombatLockdown = InCombatLockdown
|
|
||||||
local UnregisterStateDriver = UnregisterStateDriver
|
|
||||||
local RegisterStateDriver = RegisterStateDriver
|
|
||||||
local IsInInstance = IsInInstance
|
local IsInInstance = IsInInstance
|
||||||
|
|
||||||
local ns = oUF
|
local ns = oUF
|
||||||
@@ -33,6 +30,7 @@ function UF:Construct_PartyFrames()
|
|||||||
self.RaidRoleFramesAnchor = UF:Construct_RaidRoleFrames(self)
|
self.RaidRoleFramesAnchor = UF:Construct_RaidRoleFrames(self)
|
||||||
self.RaidTargetIndicator = UF:Construct_RaidIcon(self)
|
self.RaidTargetIndicator = UF:Construct_RaidIcon(self)
|
||||||
|
|
||||||
|
self.GPS = UF:Construct_GPS(self)
|
||||||
self.unitframeType = "party"
|
self.unitframeType = "party"
|
||||||
|
|
||||||
UF:Update_StatusBars()
|
UF:Update_StatusBars()
|
||||||
@@ -114,6 +112,8 @@ function UF:Update_PartyFrames(frame, db)
|
|||||||
|
|
||||||
UF:Configure_RaidIcon(frame)
|
UF:Configure_RaidIcon(frame)
|
||||||
|
|
||||||
|
UF:Configure_GPS(frame)
|
||||||
|
|
||||||
UF:Configure_RaidRoleIcons(frame)
|
UF:Configure_RaidRoleIcons(frame)
|
||||||
|
|
||||||
frame:UpdateAllElements("ElvUI_UpdateAllElements")
|
frame:UpdateAllElements("ElvUI_UpdateAllElements")
|
||||||
|
|||||||
@@ -1,14 +1,10 @@
|
|||||||
local E, L, V, P, G = unpack(ElvUI)
|
local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
||||||
local UF = E:GetModule("UnitFrames")
|
local UF = E:GetModule("UnitFrames");
|
||||||
|
|
||||||
local tinsert = table.insert
|
|
||||||
|
|
||||||
|
--Cache global variables
|
||||||
|
--Lua functions
|
||||||
|
--WoW API / Variables
|
||||||
local CreateFrame = CreateFrame
|
local CreateFrame = CreateFrame
|
||||||
local InCombatLockdown = InCombatLockdown
|
|
||||||
local IsInInstance = IsInInstance
|
|
||||||
local GetInstanceInfo = GetInstanceInfo
|
|
||||||
local UnregisterStateDriver = UnregisterStateDriver
|
|
||||||
local RegisterStateDriver = RegisterStateDriver
|
|
||||||
|
|
||||||
local ns = oUF
|
local ns = oUF
|
||||||
local ElvUF = ns.oUF
|
local ElvUF = ns.oUF
|
||||||
@@ -30,8 +26,11 @@ function UF:Construct_RaidFrames()
|
|||||||
self.Portrait2D = UF:Construct_Portrait(self, "texture")
|
self.Portrait2D = UF:Construct_Portrait(self, "texture")
|
||||||
self.Name = UF:Construct_NameText(self)
|
self.Name = UF:Construct_NameText(self)
|
||||||
self.RaidRoleFramesAnchor = UF:Construct_RaidRoleFrames(self)
|
self.RaidRoleFramesAnchor = UF:Construct_RaidRoleFrames(self)
|
||||||
self.RaidTargetIndicator = UF:Construct_RaidIcon(self);
|
self.RaidTargetIndicator = UF:Construct_RaidIcon(self)
|
||||||
|
self.MouseGlow = UF:Construct_MouseGlow(self)
|
||||||
|
self.TargetGlow = UF:Construct_TargetGlow(self)
|
||||||
|
|
||||||
|
self.GPS = UF:Construct_GPS(self)
|
||||||
self.InfoPanel = UF:Construct_InfoPanel(self)
|
self.InfoPanel = UF:Construct_InfoPanel(self)
|
||||||
UF:Update_StatusBars()
|
UF:Update_StatusBars()
|
||||||
UF:Update_FontStrings()
|
UF:Update_FontStrings()
|
||||||
@@ -112,6 +111,8 @@ function UF:Update_RaidFrames(frame, db)
|
|||||||
|
|
||||||
UF:Configure_Portrait(frame)
|
UF:Configure_Portrait(frame)
|
||||||
|
|
||||||
|
UF:Configure_GPS(frame)
|
||||||
|
|
||||||
UF:Configure_RaidIcon(frame)
|
UF:Configure_RaidIcon(frame)
|
||||||
|
|
||||||
UF:Configure_RaidRoleIcons(frame)
|
UF:Configure_RaidRoleIcons(frame)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
<Ui xmlns="http://www.blizzard.com/wow/ui/">
|
||||||
<Script file="UnitFrames.lua"/>
|
<Script file="UnitFrames.lua"/>
|
||||||
|
<Script file="Config_Enviroment.lua"/>
|
||||||
<Script file="Tags.lua"/>
|
<Script file="Tags.lua"/>
|
||||||
<Include file="Elements\Load_Elements.xml"/>
|
<Include file="Elements\Load_Elements.xml"/>
|
||||||
<Include file="Units\Load_Units.xml"/>
|
<Include file="Units\Load_Units.xml"/>
|
||||||
|
|||||||
@@ -485,6 +485,7 @@ end
|
|||||||
ElvUF.Tags.OnUpdateThrottle["pvptimer"] = 1
|
ElvUF.Tags.OnUpdateThrottle["pvptimer"] = 1
|
||||||
ElvUF.Tags.Methods["pvptimer"] = function(unit)
|
ElvUF.Tags.Methods["pvptimer"] = function(unit)
|
||||||
if (UnitIsPVPFreeForAll(unit) or UnitIsPVP(unit)) then
|
if (UnitIsPVPFreeForAll(unit) or UnitIsPVP(unit)) then
|
||||||
|
--[[
|
||||||
local timer = GetPVPTimer()
|
local timer = GetPVPTimer()
|
||||||
|
|
||||||
if timer ~= 301000 and timer ~= -1 then
|
if timer ~= 301000 and timer ~= -1 then
|
||||||
@@ -492,8 +493,9 @@ ElvUF.Tags.Methods["pvptimer"] = function(unit)
|
|||||||
local secs = floor((timer / 1000) - (mins * 60))
|
local secs = floor((timer / 1000) - (mins * 60))
|
||||||
return format("%s (%01.f:%02.f)", PVP, mins, secs)
|
return format("%s (%01.f:%02.f)", PVP, mins, secs)
|
||||||
else
|
else
|
||||||
|
]]
|
||||||
return PVP
|
return PVP
|
||||||
end
|
--end
|
||||||
else
|
else
|
||||||
return ""
|
return ""
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -693,7 +693,7 @@ function UF:CreateAndUpdateHeaderGroup(group, groupFilter, template, headerUpdat
|
|||||||
E:EnableMover(self[group].mover:GetName())
|
E:EnableMover(self[group].mover:GetName())
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- UnregisterStateDriver(self[group], "visibility")
|
--UnregisterStateDriver(self[group], "visibility")
|
||||||
self[group]:Hide()
|
self[group]:Hide()
|
||||||
if self[group].mover then
|
if self[group].mover then
|
||||||
E:DisableMover(self[group].mover:GetName())
|
E:DisableMover(self[group].mover:GetName())
|
||||||
@@ -707,8 +707,8 @@ function UF:CreateAndUpdateHeaderGroup(group, groupFilter, template, headerUpdat
|
|||||||
UF["headerFunctions"][group]["Update"] = function()
|
UF["headerFunctions"][group]["Update"] = function()
|
||||||
local db = UF.db["units"][group]
|
local db = UF.db["units"][group]
|
||||||
if db.enable ~= true then
|
if db.enable ~= true then
|
||||||
UnregisterStateDriver(UF[group], "visibility")
|
--UnregisterStateDriver(UF[group], "visibility")
|
||||||
--UF[group]:Hide()
|
UF[group]:Hide()
|
||||||
if(UF[group].mover) then
|
if(UF[group].mover) then
|
||||||
E:DisableMover(UF[group].mover:GetName())
|
E:DisableMover(UF[group].mover:GetName())
|
||||||
end
|
end
|
||||||
@@ -821,7 +821,7 @@ hiddenParent:Hide()
|
|||||||
|
|
||||||
local HandleFrame = function(baseName)
|
local HandleFrame = function(baseName)
|
||||||
local frame
|
local frame
|
||||||
if(type(baseName) == "string") then
|
if type(baseName) == "string" then
|
||||||
frame = _G[baseName]
|
frame = _G[baseName]
|
||||||
else
|
else
|
||||||
frame = baseName
|
frame = baseName
|
||||||
@@ -835,17 +835,17 @@ local HandleFrame = function(baseName)
|
|||||||
frame:SetParent(hiddenParent)
|
frame:SetParent(hiddenParent)
|
||||||
|
|
||||||
local health = frame.healthbar
|
local health = frame.healthbar
|
||||||
if(health) then
|
if health then
|
||||||
health:UnregisterAllEvents()
|
health:UnregisterAllEvents()
|
||||||
end
|
end
|
||||||
|
|
||||||
local power = frame.manabar
|
local power = frame.manabar
|
||||||
if(power) then
|
if power then
|
||||||
power:UnregisterAllEvents()
|
power:UnregisterAllEvents()
|
||||||
end
|
end
|
||||||
|
|
||||||
local spell = frame.spellbar
|
local spell = frame.spellbar
|
||||||
if(spell) then
|
if spell then
|
||||||
spell:UnregisterAllEvents()
|
spell:UnregisterAllEvents()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -868,7 +868,7 @@ function ElvUF:DisableBlizzard(unit)
|
|||||||
HandleFrame(TargetofTargetFrame)
|
HandleFrame(TargetofTargetFrame)
|
||||||
elseif string.match(unit, "(party)%d?$") == "party" and E.private["unitframe"]["disabledBlizzardFrames"].party then
|
elseif string.match(unit, "(party)%d?$") == "party" and E.private["unitframe"]["disabledBlizzardFrames"].party then
|
||||||
local id = string.match(unit, "party(%d)")
|
local id = string.match(unit, "party(%d)")
|
||||||
if(id) then
|
if id then
|
||||||
HandleFrame("PartyMemberFrame"..id)
|
HandleFrame("PartyMemberFrame"..id)
|
||||||
else
|
else
|
||||||
for i = 1, 4 do
|
for i = 1, 4 do
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
<Script file="Player.lua"/>
|
<Script file="Player.lua"/>
|
||||||
<Script file="Target.lua"/>
|
<Script file="Target.lua"/>
|
||||||
<Script file="TargetTarget.lua"/>
|
<Script file="TargetTarget.lua"/>
|
||||||
<Script file="focus.lua"/>
|
<Script file="Pet.lua"/>
|
||||||
<Script file="focustarget.lua"/>
|
<Script file="PetTarget.lua"/>
|
||||||
<Script file="pet.lua"/>
|
|
||||||
<Script file="pettarget.lua"/>
|
|
||||||
<Script file="targettargettarget.lua"/>
|
|
||||||
</Ui>
|
</Ui>
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
||||||
|
local UF = E:GetModule("UnitFrames");
|
||||||
|
|
||||||
|
--Cache global variables
|
||||||
|
--Lua functions
|
||||||
|
local _G = _G
|
||||||
|
|
||||||
|
local ns = oUF
|
||||||
|
local ElvUF = ns.oUF
|
||||||
|
assert(ElvUF, "ElvUI was unable to locate oUF.")
|
||||||
|
|
||||||
|
function UF:Construct_PetFrame(frame)
|
||||||
|
frame.Health = self:Construct_HealthBar(frame, true, true, "RIGHT")
|
||||||
|
frame.Health.frequentUpdates = true
|
||||||
|
|
||||||
|
frame.Power = self:Construct_PowerBar(frame, true, true, "LEFT")
|
||||||
|
frame.Power.frequentUpdates = true
|
||||||
|
|
||||||
|
frame.Name = self:Construct_NameText(frame)
|
||||||
|
|
||||||
|
frame.Portrait3D = self:Construct_Portrait(frame, "model")
|
||||||
|
frame.Portrait2D = self:Construct_Portrait(frame, "texture")
|
||||||
|
frame.Buffs = self:Construct_Buffs(frame)
|
||||||
|
frame.Debuffs = self:Construct_Debuffs(frame)
|
||||||
|
frame.InfoPanel = self:Construct_InfoPanel(frame)
|
||||||
|
frame.MouseGlow = self:Construct_MouseGlow(frame)
|
||||||
|
frame.TargetGlow = self:Construct_TargetGlow(frame)
|
||||||
|
|
||||||
|
E:Point(frame, "BOTTOM", E.UIParent, "BOTTOM", 0, 118)
|
||||||
|
E:CreateMover(frame, frame:GetName().."Mover", L["Pet Frame"], nil, nil, nil, "ALL,SOLO")
|
||||||
|
frame.unitframeType = "pet"
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Update_PetFrame(frame, db)
|
||||||
|
frame.db = db
|
||||||
|
|
||||||
|
do
|
||||||
|
frame.ORIENTATION = db.orientation
|
||||||
|
frame.UNIT_WIDTH = db.width
|
||||||
|
frame.UNIT_HEIGHT = db.infoPanel.enable and (db.height + db.infoPanel.height) or db.height
|
||||||
|
|
||||||
|
frame.USE_POWERBAR = db.power.enable
|
||||||
|
frame.POWERBAR_DETACHED = db.power.detachFromFrame
|
||||||
|
frame.USE_INSET_POWERBAR = not frame.POWERBAR_DETACHED and db.power.width == "inset" and frame.USE_POWERBAR
|
||||||
|
frame.USE_MINI_POWERBAR = (not frame.POWERBAR_DETACHED and db.power.width == "spaced" and frame.USE_POWERBAR)
|
||||||
|
frame.USE_POWERBAR_OFFSET = db.power.offset ~= 0 and frame.USE_POWERBAR and not frame.POWERBAR_DETACHED
|
||||||
|
frame.POWERBAR_OFFSET = frame.USE_POWERBAR_OFFSET and db.power.offset or 0
|
||||||
|
|
||||||
|
frame.POWERBAR_HEIGHT = not frame.USE_POWERBAR and 0 or db.power.height
|
||||||
|
frame.POWERBAR_WIDTH = frame.USE_MINI_POWERBAR and (frame.UNIT_WIDTH - (frame.BORDER*2))/2 or (frame.POWERBAR_DETACHED and db.power.detachedWidth or (frame.UNIT_WIDTH - ((frame.BORDER+frame.SPACING)*2)))
|
||||||
|
|
||||||
|
frame.USE_PORTRAIT = db.portrait and db.portrait.enable
|
||||||
|
frame.USE_PORTRAIT_OVERLAY = frame.USE_PORTRAIT and (db.portrait.overlay or frame.ORIENTATION == "MIDDLE")
|
||||||
|
frame.PORTRAIT_WIDTH = (frame.USE_PORTRAIT_OVERLAY or not frame.USE_PORTRAIT) and 0 or db.portrait.width
|
||||||
|
|
||||||
|
frame.USE_INFO_PANEL = not frame.USE_MINI_POWERBAR and not frame.USE_POWERBAR_OFFSET and db.infoPanel.enable
|
||||||
|
frame.INFO_PANEL_HEIGHT = frame.USE_INFO_PANEL and db.infoPanel.height or 0
|
||||||
|
|
||||||
|
frame.BOTTOM_OFFSET = UF:GetHealthBottomOffset(frame)
|
||||||
|
|
||||||
|
frame.VARIABLES_SET = true
|
||||||
|
end
|
||||||
|
|
||||||
|
frame.colors = ElvUF.colors
|
||||||
|
frame.Portrait = frame.Portrait or (db.portrait.style == "2D" and frame.Portrait2D or frame.Portrait3D)
|
||||||
|
frame:RegisterForClicks(self.db.targetOnMouseDown and "LeftButtonDown" or "LeftButtonUp", self.db.targetOnMouseDown and "RightButtonDown" or "RightButtonUp")
|
||||||
|
|
||||||
|
E:Size(frame, frame.UNIT_WIDTH, frame.UNIT_HEIGHT)
|
||||||
|
E:Size(_G[frame:GetName().."Mover"], frame:GetWidth(), frame:GetHeight())
|
||||||
|
|
||||||
|
UF:Configure_InfoPanel(frame)
|
||||||
|
|
||||||
|
UF:Configure_HealthBar(frame)
|
||||||
|
|
||||||
|
UF:UpdateNameSettings(frame)
|
||||||
|
|
||||||
|
UF:Configure_Power(frame)
|
||||||
|
|
||||||
|
UF:Configure_Portrait(frame)
|
||||||
|
|
||||||
|
UF:EnableDisable_Auras(frame)
|
||||||
|
UF:Configure_Auras(frame, "Buffs")
|
||||||
|
UF:Configure_Auras(frame, "Debuffs")
|
||||||
|
|
||||||
|
E:SetMoverSnapOffset(frame:GetName().."Mover", -(12 + db.castbar.height))
|
||||||
|
frame:UpdateAllElements("ElvUI_UpdateAllElements")
|
||||||
|
end
|
||||||
|
|
||||||
|
tinsert(UF["unitstoload"], "pet")
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
local E, L, V, P, G = unpack(ElvUI); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
||||||
|
local UF = E:GetModule("UnitFrames");
|
||||||
|
|
||||||
|
--Cache global variables
|
||||||
|
--Lua functions
|
||||||
|
local _G = _G
|
||||||
|
|
||||||
|
local ns = oUF
|
||||||
|
local ElvUF = ns.oUF
|
||||||
|
assert(ElvUF, "ElvUI was unable to locate oUF.")
|
||||||
|
|
||||||
|
function UF:Construct_PetTargetFrame(frame)
|
||||||
|
frame.Health = self:Construct_HealthBar(frame, true, true, "RIGHT")
|
||||||
|
frame.Health.frequentUpdates = true
|
||||||
|
|
||||||
|
frame.Power = self:Construct_PowerBar(frame, true, true, "LEFT")
|
||||||
|
frame.Power.frequentUpdates = true
|
||||||
|
|
||||||
|
frame.Name = self:Construct_NameText(frame)
|
||||||
|
|
||||||
|
frame.Portrait3D = self:Construct_Portrait(frame, "model")
|
||||||
|
frame.Portrait2D = self:Construct_Portrait(frame, "texture")
|
||||||
|
frame.Buffs = self:Construct_Buffs(frame)
|
||||||
|
frame.Debuffs = self:Construct_Debuffs(frame)
|
||||||
|
frame.InfoPanel = self:Construct_InfoPanel(frame)
|
||||||
|
|
||||||
|
E:Point(frame, "BOTTOM", ElvUF_Pet, "TOP", 0, 7)
|
||||||
|
E:CreateMover(frame, frame:GetName().."Mover", L["PetTarget Frame"], nil, nil, nil, "ALL,SOLO")
|
||||||
|
frame.unitframeType = "pettarget"
|
||||||
|
end
|
||||||
|
|
||||||
|
function UF:Update_PetTargetFrame(frame, db)
|
||||||
|
frame.db = db
|
||||||
|
|
||||||
|
do
|
||||||
|
frame.ORIENTATION = db.orientation
|
||||||
|
frame.UNIT_WIDTH = db.width
|
||||||
|
frame.UNIT_HEIGHT = db.infoPanel.enable and (db.height + db.infoPanel.height) or db.height
|
||||||
|
|
||||||
|
frame.USE_POWERBAR = db.power.enable
|
||||||
|
frame.POWERBAR_DETACHED = db.power.detachFromFrame
|
||||||
|
frame.USE_INSET_POWERBAR = not frame.POWERBAR_DETACHED and db.power.width == "inset" and frame.USE_POWERBAR
|
||||||
|
frame.USE_MINI_POWERBAR = (not frame.POWERBAR_DETACHED and db.power.width == "spaced" and frame.USE_POWERBAR)
|
||||||
|
frame.USE_POWERBAR_OFFSET = db.power.offset ~= 0 and frame.USE_POWERBAR and not frame.POWERBAR_DETACHED
|
||||||
|
frame.POWERBAR_OFFSET = frame.USE_POWERBAR_OFFSET and db.power.offset or 0
|
||||||
|
|
||||||
|
frame.POWERBAR_HEIGHT = not frame.USE_POWERBAR and 0 or db.power.height
|
||||||
|
frame.POWERBAR_WIDTH = frame.USE_MINI_POWERBAR and (frame.UNIT_WIDTH - (frame.BORDER*2))/2 or (frame.POWERBAR_DETACHED and db.power.detachedWidth or (frame.UNIT_WIDTH - ((frame.BORDER+frame.SPACING)*2)))
|
||||||
|
|
||||||
|
frame.USE_PORTRAIT = db.portrait and db.portrait.enable
|
||||||
|
frame.USE_PORTRAIT_OVERLAY = frame.USE_PORTRAIT and (db.portrait.overlay or frame.ORIENTATION == "MIDDLE")
|
||||||
|
frame.PORTRAIT_WIDTH = (frame.USE_PORTRAIT_OVERLAY or not frame.USE_PORTRAIT) and 0 or db.portrait.width
|
||||||
|
|
||||||
|
frame.USE_INFO_PANEL = not frame.USE_MINI_POWERBAR and not frame.USE_POWERBAR_OFFSET and db.infoPanel.enable
|
||||||
|
frame.INFO_PANEL_HEIGHT = frame.USE_INFO_PANEL and db.infoPanel.height or 0
|
||||||
|
|
||||||
|
frame.BOTTOM_OFFSET = UF:GetHealthBottomOffset(frame)
|
||||||
|
|
||||||
|
frame.VARIABLES_SET = true
|
||||||
|
end
|
||||||
|
|
||||||
|
frame.colors = ElvUF.colors
|
||||||
|
frame.Portrait = frame.Portrait or (db.portrait.style == "2D" and frame.Portrait2D or frame.Portrait3D)
|
||||||
|
frame:RegisterForClicks(self.db.targetOnMouseDown and "LeftButtonDown" or "LeftButtonUp", self.db.targetOnMouseDown and "RightButtonDown" or "RightButtonUp")
|
||||||
|
|
||||||
|
E:Size(frame, frame.UNIT_WIDTH, frame.UNIT_HEIGHT)
|
||||||
|
E:Size(_G[frame:GetName().."Mover"], frame:GetWidth(), frame:GetHeight())
|
||||||
|
|
||||||
|
UF:Configure_InfoPanel(frame)
|
||||||
|
|
||||||
|
UF:Configure_HealthBar(frame)
|
||||||
|
|
||||||
|
UF:UpdateNameSettings(frame)
|
||||||
|
|
||||||
|
UF:Configure_Power(frame)
|
||||||
|
|
||||||
|
UF:Configure_Portrait(frame)
|
||||||
|
|
||||||
|
UF:EnableDisable_Auras(frame)
|
||||||
|
UF:Configure_Auras(frame, "Buffs")
|
||||||
|
UF:Configure_Auras(frame, "Debuffs")
|
||||||
|
|
||||||
|
frame:UpdateAllElements("ElvUI_UpdateAllElements")
|
||||||
|
end
|
||||||
|
|
||||||
|
tinsert(UF["unitstoload"], "pettarget")
|
||||||
@@ -22,9 +22,13 @@ function UF:Construct_PlayerFrame(frame)
|
|||||||
|
|
||||||
frame.Portrait3D = self:Construct_Portrait(frame, "model")
|
frame.Portrait3D = self:Construct_Portrait(frame, "model")
|
||||||
frame.Portrait2D = self:Construct_Portrait(frame, "texture")
|
frame.Portrait2D = self:Construct_Portrait(frame, "texture")
|
||||||
|
frame.Buffs = self:Construct_Buffs(frame)
|
||||||
|
frame.Debuffs = self:Construct_Debuffs(frame)
|
||||||
|
frame.Castbar = self:Construct_Castbar(frame, L["Player Castbar"])
|
||||||
frame.RaidTargetIndicator = UF:Construct_RaidIcon(frame)
|
frame.RaidTargetIndicator = UF:Construct_RaidIcon(frame)
|
||||||
frame.RestingIndicator = self:Construct_RestingIndicator(frame)
|
frame.RestingIndicator = self:Construct_RestingIndicator(frame)
|
||||||
frame.CombatIndicator = self:Construct_CombatIndicator(frame)
|
frame.CombatIndicator = self:Construct_CombatIndicator(frame)
|
||||||
|
frame.PvPText = self:Construct_PvPIndicator(frame)
|
||||||
frame.InfoPanel = self:Construct_InfoPanel(frame)
|
frame.InfoPanel = self:Construct_InfoPanel(frame)
|
||||||
|
|
||||||
frame:SetPoint("BOTTOMLEFT", E.UIParent, "BOTTOM", -413, 68)
|
frame:SetPoint("BOTTOMLEFT", E.UIParent, "BOTTOM", -413, 68)
|
||||||
@@ -78,10 +82,8 @@ function UF:Update_PlayerFrame(frame, db)
|
|||||||
frame.Portrait = frame.Portrait or (db.portrait.style == "2D" and frame.Portrait2D or frame.Portrait3D)
|
frame.Portrait = frame.Portrait or (db.portrait.style == "2D" and frame.Portrait2D or frame.Portrait3D)
|
||||||
frame:RegisterForClicks(self.db.targetOnMouseDown and "LeftButtonDown" or "LeftButtonUp", self.db.targetOnMouseDown and "RightButtonDown" or "RightButtonUp")
|
frame:RegisterForClicks(self.db.targetOnMouseDown and "LeftButtonDown" or "LeftButtonUp", self.db.targetOnMouseDown and "RightButtonDown" or "RightButtonUp")
|
||||||
|
|
||||||
frame:SetWidth(frame.UNIT_WIDTH)
|
E:Size(frame, frame.UNIT_WIDTH, frame.UNIT_HEIGHT)
|
||||||
frame:SetHeight(frame.UNIT_HEIGHT)
|
E:Size(_G[frame:GetName().."Mover"], frame:GetWidth(), frame:GetHeight())
|
||||||
_G[frame:GetName().."Mover"]:SetWidth(frame:GetWidth())
|
|
||||||
_G[frame:GetName().."Mover"]:SetHeight(frame:GetHeight())
|
|
||||||
|
|
||||||
UF:Configure_InfoPanel(frame)
|
UF:Configure_InfoPanel(frame)
|
||||||
|
|
||||||
@@ -93,10 +95,18 @@ function UF:Update_PlayerFrame(frame, db)
|
|||||||
|
|
||||||
UF:UpdateNameSettings(frame)
|
UF:UpdateNameSettings(frame)
|
||||||
|
|
||||||
|
UF:Configure_PVPIndicator(frame)
|
||||||
|
|
||||||
UF:Configure_Power(frame)
|
UF:Configure_Power(frame)
|
||||||
|
|
||||||
UF:Configure_Portrait(frame)
|
UF:Configure_Portrait(frame)
|
||||||
|
|
||||||
|
UF:EnableDisable_Auras(frame)
|
||||||
|
UF:Configure_Auras(frame, "Buffs")
|
||||||
|
UF:Configure_Auras(frame, "Debuffs")
|
||||||
|
|
||||||
|
UF:Configure_Castbar(frame)
|
||||||
|
|
||||||
UF:Configure_RaidIcon(frame)
|
UF:Configure_RaidIcon(frame)
|
||||||
|
|
||||||
E:SetMoverSnapOffset(frame:GetName().."Mover", -(12 + db.castbar.height))
|
E:SetMoverSnapOffset(frame:GetName().."Mover", -(12 + db.castbar.height))
|
||||||
|
|||||||
@@ -20,8 +20,13 @@ function UF:Construct_TargetFrame(frame)
|
|||||||
|
|
||||||
frame.Portrait3D = self:Construct_Portrait(frame, "model")
|
frame.Portrait3D = self:Construct_Portrait(frame, "model")
|
||||||
frame.Portrait2D = self:Construct_Portrait(frame, "texture")
|
frame.Portrait2D = self:Construct_Portrait(frame, "texture")
|
||||||
|
frame.Buffs = self:Construct_Buffs(frame)
|
||||||
|
frame.Debuffs = self:Construct_Debuffs(frame)
|
||||||
frame.RaidTargetIndicator = UF:Construct_RaidIcon(frame)
|
frame.RaidTargetIndicator = UF:Construct_RaidIcon(frame)
|
||||||
|
frame.GPS = self:Construct_GPS(frame)
|
||||||
frame.InfoPanel = self:Construct_InfoPanel(frame)
|
frame.InfoPanel = self:Construct_InfoPanel(frame)
|
||||||
|
frame.MouseGlow = self:Construct_MouseGlow(frame)
|
||||||
|
frame.TargetGlow = self:Construct_TargetGlow(frame)
|
||||||
|
|
||||||
E:Point(frame, "BOTTOMRIGHT", E.UIParent, "BOTTOM", 413, 68)
|
E:Point(frame, "BOTTOMRIGHT", E.UIParent, "BOTTOM", 413, 68)
|
||||||
E:CreateMover(frame, frame:GetName().."Mover", L["Target Frame"], nil, nil, nil, "ALL,SOLO")
|
E:CreateMover(frame, frame:GetName().."Mover", L["Target Frame"], nil, nil, nil, "ALL,SOLO")
|
||||||
@@ -85,6 +90,12 @@ function UF:Update_TargetFrame(frame, db)
|
|||||||
|
|
||||||
UF:Configure_Portrait(frame)
|
UF:Configure_Portrait(frame)
|
||||||
|
|
||||||
|
UF:EnableDisable_Auras(frame)
|
||||||
|
UF:Configure_Auras(frame, "Buffs")
|
||||||
|
UF:Configure_Auras(frame, "Debuffs")
|
||||||
|
|
||||||
|
UF:Configure_GPS(frame)
|
||||||
|
|
||||||
UF:Configure_RaidIcon(frame)
|
UF:Configure_RaidIcon(frame)
|
||||||
|
|
||||||
E:SetMoverSnapOffset(frame:GetName().."Mover", -(12 + db.castbar.height))
|
E:SetMoverSnapOffset(frame:GetName().."Mover", -(12 + db.castbar.height))
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ function UF:Construct_TargetTargetFrame(frame)
|
|||||||
frame.Name = self:Construct_NameText(frame)
|
frame.Name = self:Construct_NameText(frame)
|
||||||
frame.Portrait3D = self:Construct_Portrait(frame, "model")
|
frame.Portrait3D = self:Construct_Portrait(frame, "model")
|
||||||
frame.Portrait2D = self:Construct_Portrait(frame, "texture")
|
frame.Portrait2D = self:Construct_Portrait(frame, "texture")
|
||||||
|
frame.Buffs = self:Construct_Buffs(frame)
|
||||||
|
frame.Debuffs = self:Construct_Debuffs(frame)
|
||||||
frame.RaidTargetIndicator = UF:Construct_RaidIcon(frame)
|
frame.RaidTargetIndicator = UF:Construct_RaidIcon(frame)
|
||||||
frame.InfoPanel = self:Construct_InfoPanel(frame)
|
frame.InfoPanel = self:Construct_InfoPanel(frame)
|
||||||
|
|
||||||
@@ -70,6 +72,10 @@ function UF:Update_TargetTargetFrame(frame, db)
|
|||||||
|
|
||||||
UF:Configure_Portrait(frame)
|
UF:Configure_Portrait(frame)
|
||||||
|
|
||||||
|
UF:EnableDisable_Auras(frame)
|
||||||
|
UF:Configure_Auras(frame, "Buffs")
|
||||||
|
UF:Configure_Auras(frame, "Debuffs")
|
||||||
|
|
||||||
UF:Configure_RaidIcon(frame)
|
UF:Configure_RaidIcon(frame)
|
||||||
|
|
||||||
E:SetMoverSnapOffset(frame:GetName().."Mover", -(12 + self.db["units"].player.castbar.height))
|
E:SetMoverSnapOffset(frame:GetName().."Mover", -(12 + self.db["units"].player.castbar.height))
|
||||||
|
|||||||
@@ -21,6 +21,11 @@ G["classtimer"] = {}
|
|||||||
|
|
||||||
G["nameplates"] = {}
|
G["nameplates"] = {}
|
||||||
|
|
||||||
|
G["unitframe"] = {
|
||||||
|
["specialFilters"] = {},
|
||||||
|
["aurafilters"] = {}
|
||||||
|
}
|
||||||
|
|
||||||
G["chat"] = {
|
G["chat"] = {
|
||||||
["classColorMentionExcludedNames"] = {}
|
["classColorMentionExcludedNames"] = {}
|
||||||
}
|
}
|
||||||
|
|||||||
+38
-756
@@ -556,7 +556,7 @@ P["bags"] = {
|
|||||||
["showBackdrop"] = false,
|
["showBackdrop"] = false,
|
||||||
["mouseover"] = false
|
["mouseover"] = false
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
--UnitFrame
|
--UnitFrame
|
||||||
P["unitframe"] = {
|
P["unitframe"] = {
|
||||||
@@ -625,6 +625,24 @@ P["unitframe"] = {
|
|||||||
[3] = {r = 0.33, g = 0.59, b = 0.33},
|
[3] = {r = 0.33, g = 0.59, b = 0.33},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
["frameGlow"] = {
|
||||||
|
["mainGlow"] = {
|
||||||
|
["enable"] = false,
|
||||||
|
["class"] = false,
|
||||||
|
["color"] = {r = 1, g = 1, b = 1, a = 1}
|
||||||
|
},
|
||||||
|
["targetGlow"] = {
|
||||||
|
["enable"] = false,
|
||||||
|
["class"] = false,
|
||||||
|
["color"] = {r = 1, g = 1, b = 1, a = 1}
|
||||||
|
},
|
||||||
|
["mouseoverGlow"] = {
|
||||||
|
["enable"] = false,
|
||||||
|
["class"] = false,
|
||||||
|
["texture"] = "ElvUI Blank",
|
||||||
|
["color"] = {r = 1, g = 1, b = 1, a = 0.1}
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
["units"] = {
|
["units"] = {
|
||||||
@@ -641,6 +659,8 @@ P["unitframe"] = {
|
|||||||
["threatStyle"] = "GLOW",
|
["threatStyle"] = "GLOW",
|
||||||
["smartAuraPosition"] = "DISABLED",
|
["smartAuraPosition"] = "DISABLED",
|
||||||
["colorOverride"] = "USE_DEFAULT",
|
["colorOverride"] = "USE_DEFAULT",
|
||||||
|
["disableMouseoverGlow"] = false,
|
||||||
|
["disableTargetGlow"] = false,
|
||||||
["health"] = {
|
["health"] = {
|
||||||
["text_format"] = "[healthcolor][health:current-percent]",
|
["text_format"] = "[healthcolor][health:current-percent]",
|
||||||
["position"] = "LEFT",
|
["position"] = "LEFT",
|
||||||
@@ -696,9 +716,9 @@ P["unitframe"] = {
|
|||||||
["scale"] = 1,
|
["scale"] = 1,
|
||||||
},
|
},
|
||||||
["portrait"] = {
|
["portrait"] = {
|
||||||
["enable"] = true,
|
["enable"] = false,
|
||||||
["width"] = 45,
|
["width"] = 45,
|
||||||
["overlay"] = true,
|
["overlay"] = false,
|
||||||
["style"] = "3D",
|
["style"] = "3D",
|
||||||
},
|
},
|
||||||
["buffs"] = {
|
["buffs"] = {
|
||||||
@@ -738,20 +758,15 @@ P["unitframe"] = {
|
|||||||
["width"] = 270,
|
["width"] = 270,
|
||||||
["height"] = 18,
|
["height"] = 18,
|
||||||
["icon"] = true,
|
["icon"] = true,
|
||||||
["latency"] = true,
|
|
||||||
["format"] = "REMAINING",
|
["format"] = "REMAINING",
|
||||||
["ticks"] = true,
|
|
||||||
["spark"] = true,
|
["spark"] = true,
|
||||||
["displayTarget"] = false,
|
|
||||||
["iconSize"] = 42,
|
["iconSize"] = 42,
|
||||||
["iconAttached"] = true,
|
["iconAttached"] = true,
|
||||||
["insideInfoPanel"] = true,
|
["insideInfoPanel"] = true,
|
||||||
["iconAttachedTo"] = "Frame",
|
["iconAttachedTo"] = "Frame",
|
||||||
["iconPosition"] = "LEFT",
|
["iconPosition"] = "LEFT",
|
||||||
["iconXOffset"] = -10,
|
["iconXOffset"] = -10,
|
||||||
["iconYOffset"] = 0,
|
["iconYOffset"] = 0
|
||||||
["tickWidth"] = 1,
|
|
||||||
["tickColor"] = {r = 0, g = 0, b = 0, a = 0.8},
|
|
||||||
},
|
},
|
||||||
["classbar"] = {
|
["classbar"] = {
|
||||||
["enable"] = true,
|
["enable"] = true,
|
||||||
@@ -805,6 +820,8 @@ P["unitframe"] = {
|
|||||||
["rangeCheck"] = true,
|
["rangeCheck"] = true,
|
||||||
["healPrediction"] = true,
|
["healPrediction"] = true,
|
||||||
["middleClickFocus"] = true,
|
["middleClickFocus"] = true,
|
||||||
|
["disableMouseoverGlow"] = false,
|
||||||
|
["disableTargetGlow"] = true,
|
||||||
["health"] = {
|
["health"] = {
|
||||||
["text_format"] = "[healthcolor][health:current-percent]",
|
["text_format"] = "[healthcolor][health:current-percent]",
|
||||||
["position"] = "RIGHT",
|
["position"] = "RIGHT",
|
||||||
@@ -954,6 +971,8 @@ P["unitframe"] = {
|
|||||||
["colorOverride"] = "USE_DEFAULT",
|
["colorOverride"] = "USE_DEFAULT",
|
||||||
["width"] = 130,
|
["width"] = 130,
|
||||||
["height"] = 36,
|
["height"] = 36,
|
||||||
|
["disableMouseoverGlow"] = false,
|
||||||
|
["disableTargetGlow"] = true,
|
||||||
["health"] = {
|
["health"] = {
|
||||||
["text_format"] = "",
|
["text_format"] = "",
|
||||||
["position"] = "RIGHT",
|
["position"] = "RIGHT",
|
||||||
@@ -1039,6 +1058,8 @@ P["unitframe"] = {
|
|||||||
["colorOverride"] = "USE_DEFAULT",
|
["colorOverride"] = "USE_DEFAULT",
|
||||||
["width"] = 130,
|
["width"] = 130,
|
||||||
["height"] = 36,
|
["height"] = 36,
|
||||||
|
["disableMouseoverGlow"] = false,
|
||||||
|
["disableTargetGlow"] = false,
|
||||||
["health"] = {
|
["health"] = {
|
||||||
["text_format"] = "",
|
["text_format"] = "",
|
||||||
["position"] = "RIGHT",
|
["position"] = "RIGHT",
|
||||||
@@ -1114,216 +1135,6 @@ P["unitframe"] = {
|
|||||||
["yOffset"] = 8,
|
["yOffset"] = 8,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
["focus"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["rangeCheck"] = true,
|
|
||||||
["threatStyle"] = "GLOW",
|
|
||||||
["orientation"] = "MIDDLE",
|
|
||||||
["smartAuraPosition"] = "DISABLED",
|
|
||||||
["colorOverride"] = "USE_DEFAULT",
|
|
||||||
["width"] = 190,
|
|
||||||
["height"] = 36,
|
|
||||||
["healPrediction"] = true,
|
|
||||||
["health"] = {
|
|
||||||
["text_format"] = "",
|
|
||||||
["position"] = "RIGHT",
|
|
||||||
["xOffset"] = -2,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["attachTextTo"] = "Health",
|
|
||||||
},
|
|
||||||
["power"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["text_format"] = "",
|
|
||||||
["width"] = "fill",
|
|
||||||
["height"] = 7,
|
|
||||||
["offset"] = 0,
|
|
||||||
["position"] = "LEFT",
|
|
||||||
["hideonnpc"] = false,
|
|
||||||
["xOffset"] = 2,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["attachTextTo"] = "Health",
|
|
||||||
},
|
|
||||||
["infoPanel"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["height"] = 14,
|
|
||||||
["transparent"] = false,
|
|
||||||
},
|
|
||||||
["name"] = {
|
|
||||||
["position"] = "CENTER",
|
|
||||||
["text_format"] = "[namecolor][name:medium]",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["attachTextTo"] = "Health",
|
|
||||||
},
|
|
||||||
["portrait"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["width"] = 45,
|
|
||||||
["overlay"] = false,
|
|
||||||
["style"] = "3D",
|
|
||||||
},
|
|
||||||
["buffs"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["perrow"] = 7,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "FRAME",
|
|
||||||
["anchorPoint"] = "BOTTOMLEFT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 300,
|
|
||||||
["priority"] = "Blacklist,Personal,PlayerBuffs,CastByUnit,Dispellable", --Focus Buffs
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
},
|
|
||||||
["debuffs"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["perrow"] = 5,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "FRAME",
|
|
||||||
["anchorPoint"] = "TOPRIGHT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 300,
|
|
||||||
["priority"] = "Blacklist,Personal,RaidDebuffs,Dispellable,Whitelist", --Focus Debuffs
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
},
|
|
||||||
["castbar"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["width"] = 190,
|
|
||||||
["height"] = 18,
|
|
||||||
["icon"] = true,
|
|
||||||
["format"] = "REMAINING",
|
|
||||||
["spark"] = true,
|
|
||||||
["iconSize"] = 32,
|
|
||||||
["iconAttached"] = true,
|
|
||||||
["insideInfoPanel"] = true,
|
|
||||||
["iconAttachedTo"] = "Frame",
|
|
||||||
["iconPosition"] = "LEFT",
|
|
||||||
["iconXOffset"] = -10,
|
|
||||||
["iconYOffset"] = 0,
|
|
||||||
},
|
|
||||||
["aurabar"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["anchorPoint"] = "ABOVE",
|
|
||||||
["attachTo"] = "DEBUFFS",
|
|
||||||
["maxBars"] = 3,
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 120,
|
|
||||||
["priority"] = "Blacklist,blockNoDuration,Personal,PlayerBuffs,RaidDebuffs", --Focus AuraBars
|
|
||||||
["friendlyAuraType"] = "HELPFUL",
|
|
||||||
["enemyAuraType"] = "HARMFUL",
|
|
||||||
["height"] = 20,
|
|
||||||
["sort"] = "TIME_REMAINING",
|
|
||||||
["uniformThreshold"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
},
|
|
||||||
["raidicon"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["size"] = 18,
|
|
||||||
["attachTo"] = "TOP",
|
|
||||||
["attachToObject"] = "Frame",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 8,
|
|
||||||
},
|
|
||||||
["GPSArrow"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["size"] = 45,
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["onMouseOver"] = true,
|
|
||||||
["outOfRange"] = true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
["focustarget"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["rangeCheck"] = true,
|
|
||||||
["threatStyle"] = "NONE",
|
|
||||||
["orientation"] = "MIDDLE",
|
|
||||||
["smartAuraPosition"] = "DISABLED",
|
|
||||||
["colorOverride"] = "USE_DEFAULT",
|
|
||||||
["width"] = 190,
|
|
||||||
["height"] = 26,
|
|
||||||
["health"] = {
|
|
||||||
["text_format"] = "",
|
|
||||||
["position"] = "RIGHT",
|
|
||||||
["xOffset"] = -2,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
},
|
|
||||||
["power"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["text_format"] = "",
|
|
||||||
["width"] = "fill",
|
|
||||||
["height"] = 7,
|
|
||||||
["offset"] = 0,
|
|
||||||
["position"] = "LEFT",
|
|
||||||
["hideonnpc"] = false,
|
|
||||||
["xOffset"] = 2,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
},
|
|
||||||
["infoPanel"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["height"] = 12,
|
|
||||||
["transparent"] = false,
|
|
||||||
},
|
|
||||||
["name"] = {
|
|
||||||
["position"] = "CENTER",
|
|
||||||
["text_format"] = "[namecolor][name:medium]",
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["xOffset"] = 0,
|
|
||||||
},
|
|
||||||
["portrait"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["width"] = 45,
|
|
||||||
["overlay"] = false,
|
|
||||||
["style"] = "3D",
|
|
||||||
},
|
|
||||||
["buffs"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["perrow"] = 7,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "FRAME",
|
|
||||||
["anchorPoint"] = "BOTTOMLEFT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 300,
|
|
||||||
["priority"] = "Blacklist,Personal,PlayerBuffs,Dispellable,CastByUnit", --FocusTarget Buffs
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
},
|
|
||||||
["debuffs"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["perrow"] = 5,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "FRAME",
|
|
||||||
["anchorPoint"] = "BOTTOMRIGHT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 300,
|
|
||||||
["priority"] = "Blacklist,Personal,RaidDebuffs,Dispellable,Whitelist", --FocusTarget Debuffs
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
},
|
|
||||||
["raidicon"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["size"] = 18,
|
|
||||||
["attachTo"] = "TOP",
|
|
||||||
["attachToObject"] = "Frame",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 8,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
["pet"] = {
|
["pet"] = {
|
||||||
["enable"] = true,
|
["enable"] = true,
|
||||||
["rangeCheck"] = true,
|
["rangeCheck"] = true,
|
||||||
@@ -1333,6 +1144,8 @@ P["unitframe"] = {
|
|||||||
["colorOverride"] = "USE_DEFAULT",
|
["colorOverride"] = "USE_DEFAULT",
|
||||||
["width"] = 130,
|
["width"] = 130,
|
||||||
["height"] = 36,
|
["height"] = 36,
|
||||||
|
["disableMouseoverGlow"] = false,
|
||||||
|
["disableTargetGlow"] = true,
|
||||||
["healPrediction"] = true,
|
["healPrediction"] = true,
|
||||||
["health"] = {
|
["health"] = {
|
||||||
["text_format"] = "",
|
["text_format"] = "",
|
||||||
@@ -1430,6 +1243,8 @@ P["unitframe"] = {
|
|||||||
["colorOverride"] = "USE_DEFAULT",
|
["colorOverride"] = "USE_DEFAULT",
|
||||||
["width"] = 130,
|
["width"] = 130,
|
||||||
["height"] = 26,
|
["height"] = 26,
|
||||||
|
["disableMouseoverGlow"] = false,
|
||||||
|
["disableTargetGlow"] = false,
|
||||||
["health"] = {
|
["health"] = {
|
||||||
["text_format"] = "",
|
["text_format"] = "",
|
||||||
["position"] = "RIGHT",
|
["position"] = "RIGHT",
|
||||||
@@ -1497,218 +1312,6 @@ P["unitframe"] = {
|
|||||||
["yOffset"] = 0,
|
["yOffset"] = 0,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
["boss"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["rangeCheck"] = true,
|
|
||||||
["growthDirection"] = "DOWN",
|
|
||||||
["orientation"] = "RIGHT",
|
|
||||||
["smartAuraPosition"] = "DISABLED",
|
|
||||||
["colorOverride"] = "USE_DEFAULT",
|
|
||||||
["width"] = 216,
|
|
||||||
["height"] = 46,
|
|
||||||
["spacing"] = 25,
|
|
||||||
["targetGlow"] = true,
|
|
||||||
["health"] = {
|
|
||||||
["text_format"] = "[healthcolor][health:current]",
|
|
||||||
["position"] = "LEFT",
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["xOffset"] = 2,
|
|
||||||
["attachTextTo"] = "Health",
|
|
||||||
},
|
|
||||||
["power"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["text_format"] = "[powercolor][power:current]",
|
|
||||||
["width"] = "fill",
|
|
||||||
["height"] = 7,
|
|
||||||
["offset"] = 0,
|
|
||||||
["position"] = "RIGHT",
|
|
||||||
["hideonnpc"] = false,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["xOffset"] = -2,
|
|
||||||
["attachTextTo"] = "Health",
|
|
||||||
},
|
|
||||||
["portrait"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["width"] = 35,
|
|
||||||
["overlay"] = false,
|
|
||||||
["style"] = "3D",
|
|
||||||
},
|
|
||||||
["infoPanel"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["height"] = 16,
|
|
||||||
["transparent"] = false,
|
|
||||||
},
|
|
||||||
["name"] = {
|
|
||||||
["position"] = "CENTER",
|
|
||||||
["text_format"] = "[namecolor][name:medium]",
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["attachTextTo"] = "Health",
|
|
||||||
},
|
|
||||||
["buffs"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["perrow"] = 3,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "FRAME",
|
|
||||||
["anchorPoint"] = "LEFT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 0,
|
|
||||||
["priority"] = "Blacklist,CastByUnit,Whitelist", --Boss Buffs
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 20,
|
|
||||||
["sizeOverride"] = 22,
|
|
||||||
},
|
|
||||||
["debuffs"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["perrow"] = 3,
|
|
||||||
["numrows"] = 2,
|
|
||||||
["attachTo"] = "FRAME",
|
|
||||||
["anchorPoint"] = "LEFT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 0,
|
|
||||||
["priority"] = "Blacklist,Personal,RaidDebuffs,CastByUnit,Whitelist", --Boss Debuffs
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = -3,
|
|
||||||
["sizeOverride"] = 22,
|
|
||||||
},
|
|
||||||
["castbar"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["width"] = 215,
|
|
||||||
["height"] = 18,
|
|
||||||
["icon"] = true,
|
|
||||||
["format"] = "REMAINING",
|
|
||||||
["spark"] = true,
|
|
||||||
["iconSize"] = 32,
|
|
||||||
["iconAttached"] = true,
|
|
||||||
["insideInfoPanel"] = true,
|
|
||||||
["iconAttachedTo"] = "Frame",
|
|
||||||
["iconPosition"] = "LEFT",
|
|
||||||
["iconXOffset"] = -10,
|
|
||||||
["iconYOffset"] = 0,
|
|
||||||
},
|
|
||||||
["raidicon"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["size"] = 18,
|
|
||||||
["attachTo"] = "TOP",
|
|
||||||
["attachToObject"] = "Frame",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 8,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
["arena"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["rangeCheck"] = true,
|
|
||||||
["growthDirection"] = "DOWN",
|
|
||||||
["orientation"] = "RIGHT",
|
|
||||||
["smartAuraPosition"] = "DISABLED",
|
|
||||||
["spacing"] = 25,
|
|
||||||
["width"] = 246,
|
|
||||||
["height"] = 47,
|
|
||||||
["healPrediction"] = true,
|
|
||||||
["colorOverride"] = "USE_DEFAULT",
|
|
||||||
["targetGlow"] = true,
|
|
||||||
["health"] = {
|
|
||||||
["text_format"] = "[healthcolor][health:current]",
|
|
||||||
["position"] = "LEFT",
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["xOffset"] = 2,
|
|
||||||
["attachTextTo"] = "Health",
|
|
||||||
},
|
|
||||||
["power"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["text_format"] = "[powercolor][power:current]",
|
|
||||||
["width"] = "fill",
|
|
||||||
["height"] = 7,
|
|
||||||
["offset"] = 0,
|
|
||||||
["attachTextTo"] = "Health",
|
|
||||||
["position"] = "RIGHT",
|
|
||||||
["hideonnpc"] = false,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["xOffset"] = -2,
|
|
||||||
},
|
|
||||||
["infoPanel"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["height"] = 17,
|
|
||||||
["transparent"] = false,
|
|
||||||
},
|
|
||||||
["name"] = {
|
|
||||||
["position"] = "CENTER",
|
|
||||||
["text_format"] = "[namecolor][name:medium]",
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["attachTextTo"] = "Health",
|
|
||||||
},
|
|
||||||
["portrait"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["width"] = 45,
|
|
||||||
["overlay"] = false,
|
|
||||||
["style"] = "3D",
|
|
||||||
},
|
|
||||||
["buffs"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["perrow"] = 3,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "FRAME",
|
|
||||||
["anchorPoint"] = "LEFT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 300,
|
|
||||||
["priority"] = "Blacklist,TurtleBuffs,PlayerBuffs,Dispellable", --Arena Buffs
|
|
||||||
["sizeOverride"] = 27,
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 16,
|
|
||||||
},
|
|
||||||
["debuffs"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["perrow"] = 3,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "FRAME",
|
|
||||||
["anchorPoint"] = "LEFT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 300,
|
|
||||||
["priority"] = "Blacklist,blockNoDuration,Personal,CCDebuffs,Whitelist", --Arena Debuffs
|
|
||||||
["sizeOverride"] = 27,
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = -16,
|
|
||||||
},
|
|
||||||
["castbar"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["width"] = 256,
|
|
||||||
["height"] = 18,
|
|
||||||
["icon"] = true,
|
|
||||||
["format"] = "REMAINING",
|
|
||||||
["spark"] = true,
|
|
||||||
["iconSize"] = 32,
|
|
||||||
["iconAttached"] = true,
|
|
||||||
["insideInfoPanel"] = true,
|
|
||||||
["iconAttachedTo"] = "Frame",
|
|
||||||
["iconPosition"] = "LEFT",
|
|
||||||
["iconXOffset"] = -10,
|
|
||||||
["iconYOffset"] = 0,
|
|
||||||
},
|
|
||||||
["pvpTrinket"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["position"] = "RIGHT",
|
|
||||||
["size"] = 46,
|
|
||||||
["xOffset"] = 1,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
["party"] = {
|
["party"] = {
|
||||||
["enable"] = true,
|
["enable"] = true,
|
||||||
["rangeCheck"] = true,
|
["rangeCheck"] = true,
|
||||||
@@ -1730,7 +1333,8 @@ P["unitframe"] = {
|
|||||||
["colorOverride"] = "USE_DEFAULT",
|
["colorOverride"] = "USE_DEFAULT",
|
||||||
["width"] = 184,
|
["width"] = 184,
|
||||||
["height"] = 54,
|
["height"] = 54,
|
||||||
["targetGlow"] = true,
|
["disableMouseoverGlow"] = false,
|
||||||
|
["disableTargetGlow"] = false,
|
||||||
["health"] = {
|
["health"] = {
|
||||||
["text_format"] = "[healthcolor][health:current-percent]",
|
["text_format"] = "[healthcolor][health:current-percent]",
|
||||||
["position"] = "LEFT",
|
["position"] = "LEFT",
|
||||||
@@ -1917,7 +1521,8 @@ P["unitframe"] = {
|
|||||||
["colorOverride"] = "USE_DEFAULT",
|
["colorOverride"] = "USE_DEFAULT",
|
||||||
["width"] = 80,
|
["width"] = 80,
|
||||||
["height"] = 44,
|
["height"] = 44,
|
||||||
["targetGlow"] = true,
|
["disableMouseoverGlow"] = false,
|
||||||
|
["disableTargetGlow"] = false,
|
||||||
["health"] = {
|
["health"] = {
|
||||||
["text_format"] = "[healthcolor][health:deficit]",
|
["text_format"] = "[healthcolor][health:deficit]",
|
||||||
["position"] = "BOTTOM",
|
["position"] = "BOTTOM",
|
||||||
@@ -2056,163 +1661,6 @@ P["unitframe"] = {
|
|||||||
["yOffset"] = 2,
|
["yOffset"] = 2,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
["raid40"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["rangeCheck"] = true,
|
|
||||||
["threatStyle"] = "GLOW",
|
|
||||||
["orientation"] = "MIDDLE",
|
|
||||||
["visibility"] = "[@raid26,noexists] hide;show",
|
|
||||||
["growthDirection"] = "RIGHT_DOWN",
|
|
||||||
["horizontalSpacing"] = 3,
|
|
||||||
["verticalSpacing"] = 3,
|
|
||||||
["numGroups"] = 8,
|
|
||||||
["groupsPerRowCol"] = 1,
|
|
||||||
["groupBy"] = "GROUP",
|
|
||||||
["sortDir"] = "ASC",
|
|
||||||
["showPlayer"] = true,
|
|
||||||
["healPrediction"] = false,
|
|
||||||
["colorOverride"] = "USE_DEFAULT",
|
|
||||||
["width"] = 80,
|
|
||||||
["height"] = 27,
|
|
||||||
["targetGlow"] = true,
|
|
||||||
["health"] = {
|
|
||||||
["text_format"] = "[healthcolor][health:deficit]",
|
|
||||||
["position"] = "BOTTOM",
|
|
||||||
["orientation"] = "HORIZONTAL",
|
|
||||||
["frequentUpdates"] = false,
|
|
||||||
["attachTextTo"] = "Health",
|
|
||||||
["yOffset"] = 2,
|
|
||||||
["xOffset"] = 0,
|
|
||||||
},
|
|
||||||
["power"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["text_format"] = "",
|
|
||||||
["width"] = "fill",
|
|
||||||
["height"] = 7,
|
|
||||||
["offset"] = 0,
|
|
||||||
["position"] = "BOTTOMRIGHT",
|
|
||||||
["hideonnpc"] = false,
|
|
||||||
["yOffset"] = 2,
|
|
||||||
["xOffset"] = -2,
|
|
||||||
},
|
|
||||||
["infoPanel"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["height"] = 12,
|
|
||||||
["transparent"] = false,
|
|
||||||
},
|
|
||||||
["name"] = {
|
|
||||||
["position"] = "CENTER",
|
|
||||||
["text_format"] = "[namecolor][name:short]",
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["attachTextTo"] = "Health",
|
|
||||||
},
|
|
||||||
["portrait"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["width"] = 45,
|
|
||||||
["overlay"] = false,
|
|
||||||
["style"] = "3D",
|
|
||||||
},
|
|
||||||
["buffs"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["perrow"] = 3,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "FRAME",
|
|
||||||
["anchorPoint"] = "LEFT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["countFontSize"] = 10,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 300,
|
|
||||||
["priority"] = "Blacklist,TurtleBuffs", --Raid40 Buffs
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
},
|
|
||||||
["debuffs"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["perrow"] = 3,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "FRAME",
|
|
||||||
["anchorPoint"] = "RIGHT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["countFontSize"] = 10,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 300,
|
|
||||||
["priority"] = "Blacklist,RaidDebuffs,CCDebuffs,Dispellable,Whitelist", --Raid40 Debuffs
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
},
|
|
||||||
["rdebuffs"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["showDispellableDebuff"] = true,
|
|
||||||
["onlyMatchSpellID"] = true,
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["font"] = "Homespun",
|
|
||||||
["fontOutline"] = "MONOCHROMEOUTLINE",
|
|
||||||
["size"] = 22,
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["duration"] = {
|
|
||||||
["position"] = "CENTER",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["color"] = {r = 1, g = 0.9, b = 0, a = 1}
|
|
||||||
},
|
|
||||||
["stack"] = {
|
|
||||||
["position"] = "BOTTOMRIGHT",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 2,
|
|
||||||
["color"] = {r = 1, g = 0.9, b = 0, a = 1}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
["roleIcon"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["position"] = "BOTTOMRIGHT",
|
|
||||||
["attachTo"] = "Health",
|
|
||||||
["xOffset"] = -1,
|
|
||||||
["yOffset"] = 1,
|
|
||||||
["size"] = 15,
|
|
||||||
},
|
|
||||||
["raidRoleIcons"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["position"] = "TOPLEFT",
|
|
||||||
},
|
|
||||||
["buffIndicator"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["size"] = 8,
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["profileSpecific"] = false,
|
|
||||||
},
|
|
||||||
["raidicon"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["size"] = 18,
|
|
||||||
["attachTo"] = "TOP",
|
|
||||||
["attachToObject"] = "Frame",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 8,
|
|
||||||
},
|
|
||||||
["GPSArrow"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["size"] = 45,
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["onMouseOver"] = true,
|
|
||||||
["outOfRange"] = true,
|
|
||||||
},
|
|
||||||
["readycheckIcon"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["size"] = 12,
|
|
||||||
["attachTo"] = "Health",
|
|
||||||
["position"] = "BOTTOM",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 2,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
["raidpet"] = {
|
["raidpet"] = {
|
||||||
["enable"] = false,
|
["enable"] = false,
|
||||||
["rangeCheck"] = true,
|
["rangeCheck"] = true,
|
||||||
@@ -2327,172 +1775,6 @@ P["unitframe"] = {
|
|||||||
["yOffset"] = 8,
|
["yOffset"] = 8,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
["tank"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["orientation"] = "LEFT",
|
|
||||||
["threatStyle"] = "GLOW",
|
|
||||||
["colorOverride"] = "USE_DEFAULT",
|
|
||||||
["rangeCheck"] = true,
|
|
||||||
["width"] = 120,
|
|
||||||
["height"] = 28,
|
|
||||||
["disableDebuffHighlight"] = true,
|
|
||||||
["verticalSpacing"] = 7,
|
|
||||||
["buffs"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["perrow"] = 6,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "FRAME",
|
|
||||||
["anchorPoint"] = "TOPLEFT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["countFontSize"] = 10,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 0,
|
|
||||||
["priority"] = "",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 2,
|
|
||||||
},
|
|
||||||
["debuffs"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["perrow"] = 6,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "BUFFS",
|
|
||||||
["anchorPoint"] = "TOPRIGHT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["countFontSize"] = 10,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 0,
|
|
||||||
["priority"] = "",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 1,
|
|
||||||
},
|
|
||||||
["buffIndicator"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["size"] = 8,
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["profileSpecific"] = false,
|
|
||||||
},
|
|
||||||
["rdebuffs"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["showDispellableDebuff"] = true,
|
|
||||||
["onlyMatchSpellID"] = true,
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["font"] = "Homespun",
|
|
||||||
["fontOutline"] = "MONOCHROMEOUTLINE",
|
|
||||||
["size"] = 26,
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["duration"] = {
|
|
||||||
["position"] = "CENTER",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["color"] = {r = 1, g = 0.9, b = 0, a = 1}
|
|
||||||
},
|
|
||||||
["stack"] = {
|
|
||||||
["position"] = "BOTTOMRIGHT",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 2,
|
|
||||||
["color"] = {r = 1, g = 0.9, b = 0, a = 1}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
["targetsGroup"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["anchorPoint"] = "RIGHT",
|
|
||||||
["xOffset"] = 1,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["width"] = 120,
|
|
||||||
["height"] = 28,
|
|
||||||
["colorOverride"] = "USE_DEFAULT",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
["assist"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["orientation"] = "LEFT",
|
|
||||||
["threatStyle"] = "GLOW",
|
|
||||||
["colorOverride"] = "USE_DEFAULT",
|
|
||||||
["rangeCheck"] = true,
|
|
||||||
["width"] = 120,
|
|
||||||
["height"] = 28,
|
|
||||||
["disableDebuffHighlight"] = true,
|
|
||||||
["verticalSpacing"] = 7,
|
|
||||||
["buffs"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["perrow"] = 6,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "FRAME",
|
|
||||||
["anchorPoint"] = "TOPLEFT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["countFontSize"] = 10,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 0,
|
|
||||||
["priority"] = "",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 2,
|
|
||||||
},
|
|
||||||
["debuffs"] = {
|
|
||||||
["enable"] = false,
|
|
||||||
["perrow"] = 6,
|
|
||||||
["numrows"] = 1,
|
|
||||||
["attachTo"] = "BUFFS",
|
|
||||||
["anchorPoint"] = "TOPRIGHT",
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["countFontSize"] = 10,
|
|
||||||
["sortMethod"] = "TIME_REMAINING",
|
|
||||||
["sortDirection"] = "DESCENDING",
|
|
||||||
["clickThrough"] = false,
|
|
||||||
["minDuration"] = 0,
|
|
||||||
["maxDuration"] = 0,
|
|
||||||
["priority"] = "",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 1,
|
|
||||||
},
|
|
||||||
["buffIndicator"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["size"] = 8,
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["profileSpecific"] = false,
|
|
||||||
},
|
|
||||||
["rdebuffs"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["showDispellableDebuff"] = true,
|
|
||||||
["onlyMatchSpellID"] = true,
|
|
||||||
["fontSize"] = 10,
|
|
||||||
["font"] = "Homespun",
|
|
||||||
["fontOutline"] = "MONOCHROMEOUTLINE",
|
|
||||||
["size"] = 26,
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["duration"] = {
|
|
||||||
["position"] = "CENTER",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["color"] = {r = 1, g = 0.9, b = 0, a = 1}
|
|
||||||
},
|
|
||||||
["stack"] = {
|
|
||||||
["position"] = "BOTTOMRIGHT",
|
|
||||||
["xOffset"] = 0,
|
|
||||||
["yOffset"] = 2,
|
|
||||||
["color"] = {r = 1, g = 0.9, b = 0, a = 1}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
["targetsGroup"] = {
|
|
||||||
["enable"] = true,
|
|
||||||
["anchorPoint"] = "RIGHT",
|
|
||||||
["xOffset"] = 1,
|
|
||||||
["yOffset"] = 0,
|
|
||||||
["width"] = 120,
|
|
||||||
["height"] = 28,
|
|
||||||
["colorOverride"] = "USE_DEFAULT",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -692,7 +692,7 @@ end
|
|||||||
E.Options.args.actionbar = {
|
E.Options.args.actionbar = {
|
||||||
type = "group",
|
type = "group",
|
||||||
name = L["ActionBars"],
|
name = L["ActionBars"],
|
||||||
childGroups = "tab",
|
childGroups = "tree",
|
||||||
get = function(info) return E.db.actionbar[ info[getn(info)] ] end,
|
get = function(info) return E.db.actionbar[ info[getn(info)] ] end,
|
||||||
set = function(info, value) E.db.actionbar[ info[getn(info)] ] = value AB:UpdateButtonSettings() end,
|
set = function(info, value) E.db.actionbar[ info[getn(info)] ] = value AB:UpdateButtonSettings() end,
|
||||||
args = {
|
args = {
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ local Media = LibStub("LibSharedMedia-3.0")
|
|||||||
|
|
||||||
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
|
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
|
||||||
|
|
||||||
|
local next, ipairs, pairs = next, ipairs, pairs
|
||||||
|
local upper = string.upper
|
||||||
|
local tinsert, sort, tremove = table.insert, table.sort, table.remove
|
||||||
|
|
||||||
do
|
do
|
||||||
local widgetType = "LSM30_Background"
|
local widgetType = "LSM30_Background"
|
||||||
local widgetVersion = 11
|
local widgetVersion = 11
|
||||||
@@ -15,7 +19,7 @@ do
|
|||||||
self:ClearAllPoints()
|
self:ClearAllPoints()
|
||||||
self:Hide()
|
self:Hide()
|
||||||
self.check:Hide()
|
self.check:Hide()
|
||||||
table.insert(contentFrameCache, self)
|
tinsert(contentFrameCache, self)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function ContentOnClick(this, button)
|
local function ContentOnClick(this, button)
|
||||||
@@ -36,7 +40,7 @@ do
|
|||||||
local function GetContentLine()
|
local function GetContentLine()
|
||||||
local frame
|
local frame
|
||||||
if next(contentFrameCache) then
|
if next(contentFrameCache) then
|
||||||
frame = table.remove(contentFrameCache)
|
frame = tremove(contentFrameCache)
|
||||||
else
|
else
|
||||||
frame = CreateFrame("Button", nil, UIParent)
|
frame = CreateFrame("Button", nil, UIParent)
|
||||||
--frame:SetWidth(200)
|
--frame:SetWidth(200)
|
||||||
@@ -140,7 +144,7 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function textSort(a,b)
|
local function textSort(a,b)
|
||||||
return string.upper(a) < string.upper(b)
|
return upper(a) < upper(b)
|
||||||
end
|
end
|
||||||
|
|
||||||
local sortedlist = {}
|
local sortedlist = {}
|
||||||
@@ -156,19 +160,18 @@ do
|
|||||||
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
|
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
|
||||||
self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
|
self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
|
||||||
for k, v in pairs(self.list) do
|
for k, v in pairs(self.list) do
|
||||||
sortedlist[getn(sortedlist)+1] = k
|
tinsert(sortedlist, k)
|
||||||
end
|
end
|
||||||
table.sort(sortedlist, textSort)
|
sort(sortedlist, textSort)
|
||||||
for i, k in ipairs(sortedlist) do
|
for i, k in ipairs(sortedlist) do
|
||||||
local f = GetContentLine()
|
local f = GetContentLine()
|
||||||
f.text:SetText(k)
|
f.text:SetText(k)
|
||||||
--print(k)
|
|
||||||
if k == self.value then
|
if k == self.value then
|
||||||
f.check:Show()
|
f.check:Show()
|
||||||
end
|
end
|
||||||
f.obj = self
|
f.obj = self
|
||||||
f.dropdown = self.dropdown
|
f.dropdown = self.dropdown
|
||||||
self.dropdown:AddFrame(f)
|
self.dropdown:AddFrame(f, i)
|
||||||
end
|
end
|
||||||
wipe(sortedlist)
|
wipe(sortedlist)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ local Media = LibStub("LibSharedMedia-3.0")
|
|||||||
|
|
||||||
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
|
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
|
||||||
|
|
||||||
|
local next, ipairs, pairs = next, ipairs, pairs
|
||||||
|
local upper = string.upper
|
||||||
|
local tinsert, sort, tremove = table.insert, table.sort, table.remove
|
||||||
|
|
||||||
do
|
do
|
||||||
local widgetType = "LSM30_Border"
|
local widgetType = "LSM30_Border"
|
||||||
local widgetVersion = 11
|
local widgetVersion = 11
|
||||||
@@ -15,7 +19,7 @@ do
|
|||||||
self:ClearAllPoints()
|
self:ClearAllPoints()
|
||||||
self:Hide()
|
self:Hide()
|
||||||
self.check:Hide()
|
self.check:Hide()
|
||||||
table.insert(contentFrameCache, self)
|
tinsert(contentFrameCache, self)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function ContentOnClick(this, button)
|
local function ContentOnClick(this, button)
|
||||||
@@ -39,7 +43,7 @@ do
|
|||||||
local function GetContentLine()
|
local function GetContentLine()
|
||||||
local frame
|
local frame
|
||||||
if next(contentFrameCache) then
|
if next(contentFrameCache) then
|
||||||
frame = table.remove(contentFrameCache)
|
frame = tremove(contentFrameCache)
|
||||||
else
|
else
|
||||||
frame = CreateFrame("Button", nil, UIParent)
|
frame = CreateFrame("Button", nil, UIParent)
|
||||||
--frame:SetWidth(200)
|
--frame:SetWidth(200)
|
||||||
@@ -135,7 +139,7 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function textSort(a,b)
|
local function textSort(a,b)
|
||||||
return string.upper(a) < string.upper(b)
|
return upper(a) < upper(b)
|
||||||
end
|
end
|
||||||
|
|
||||||
local sortedlist = {}
|
local sortedlist = {}
|
||||||
@@ -151,19 +155,18 @@ do
|
|||||||
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
|
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
|
||||||
self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
|
self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
|
||||||
for k, v in pairs(self.list) do
|
for k, v in pairs(self.list) do
|
||||||
sortedlist[getn(sortedlist)+1] = k
|
tinsert(sortedlist, k)
|
||||||
end
|
end
|
||||||
table.sort(sortedlist, textSort)
|
sort(sortedlist, textSort)
|
||||||
for i, k in ipairs(sortedlist) do
|
for i, k in ipairs(sortedlist) do
|
||||||
local f = GetContentLine()
|
local f = GetContentLine()
|
||||||
f.text:SetText(k)
|
f.text:SetText(k)
|
||||||
--print(k)
|
|
||||||
if k == self.value then
|
if k == self.value then
|
||||||
f.check:Show()
|
f.check:Show()
|
||||||
end
|
end
|
||||||
f.obj = self
|
f.obj = self
|
||||||
f.dropdown = self.dropdown
|
f.dropdown = self.dropdown
|
||||||
self.dropdown:AddFrame(f)
|
self.dropdown:AddFrame(f, i)
|
||||||
end
|
end
|
||||||
wipe(sortedlist)
|
wipe(sortedlist)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ local Media = LibStub("LibSharedMedia-3.0")
|
|||||||
|
|
||||||
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
|
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
|
||||||
|
|
||||||
|
local next, ipairs, pairs = next, ipairs, pairs
|
||||||
|
local upper = string.upper
|
||||||
|
local tinsert, sort, tremove = table.insert, table.sort, table.remove
|
||||||
|
|
||||||
do
|
do
|
||||||
local widgetType = "LSM30_Font"
|
local widgetType = "LSM30_Font"
|
||||||
local widgetVersion = 11
|
local widgetVersion = 11
|
||||||
@@ -15,7 +19,7 @@ do
|
|||||||
self:ClearAllPoints()
|
self:ClearAllPoints()
|
||||||
self:Hide()
|
self:Hide()
|
||||||
self.check:Hide()
|
self.check:Hide()
|
||||||
table.insert(contentFrameCache, self)
|
tinsert(contentFrameCache, self)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function ContentOnClick()
|
local function ContentOnClick()
|
||||||
@@ -29,7 +33,7 @@ do
|
|||||||
local function GetContentLine()
|
local function GetContentLine()
|
||||||
local frame
|
local frame
|
||||||
if next(contentFrameCache) then
|
if next(contentFrameCache) then
|
||||||
frame = table.remove(contentFrameCache)
|
frame = tremove(contentFrameCache)
|
||||||
else
|
else
|
||||||
frame = CreateFrame("Button", nil, UIParent)
|
frame = CreateFrame("Button", nil, UIParent)
|
||||||
--frame:SetWidth(200)
|
--frame:SetWidth(200)
|
||||||
@@ -120,7 +124,7 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function textSort(a,b)
|
local function textSort(a,b)
|
||||||
return string.upper(a) < string.upper(b)
|
return upper(a) < upper(b)
|
||||||
end
|
end
|
||||||
|
|
||||||
local sortedlist = {}
|
local sortedlist = {}
|
||||||
@@ -136,9 +140,9 @@ do
|
|||||||
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
|
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
|
||||||
self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
|
self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
|
||||||
for k, v in pairs(self.list) do
|
for k, v in pairs(self.list) do
|
||||||
sortedlist[getn(sortedlist)+1] = k
|
tinsert(sortedlist, k)
|
||||||
end
|
end
|
||||||
table.sort(sortedlist, textSort)
|
sort(sortedlist, textSort)
|
||||||
for i, k in ipairs(sortedlist) do
|
for i, k in ipairs(sortedlist) do
|
||||||
local f = GetContentLine()
|
local f = GetContentLine()
|
||||||
local _, size, outline= f.text:GetFont()
|
local _, size, outline= f.text:GetFont()
|
||||||
@@ -149,7 +153,7 @@ do
|
|||||||
f.check:Show()
|
f.check:Show()
|
||||||
end
|
end
|
||||||
f.obj = self
|
f.obj = self
|
||||||
self.dropdown:AddFrame(f)
|
self.dropdown:AddFrame(f, i)
|
||||||
end
|
end
|
||||||
wipe(sortedlist)
|
wipe(sortedlist)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ local Media = LibStub("LibSharedMedia-3.0")
|
|||||||
|
|
||||||
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
|
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
|
||||||
|
|
||||||
|
local next, ipairs, pairs = next, ipairs, pairs
|
||||||
|
local upper = string.upper
|
||||||
|
local tinsert, sort, tremove = table.insert, table.sort, table.remove
|
||||||
|
|
||||||
do
|
do
|
||||||
local widgetType = "LSM30_Sound"
|
local widgetType = "LSM30_Sound"
|
||||||
local widgetVersion = 11
|
local widgetVersion = 11
|
||||||
@@ -15,7 +19,7 @@ do
|
|||||||
self:ClearAllPoints()
|
self:ClearAllPoints()
|
||||||
self:Hide()
|
self:Hide()
|
||||||
self.check:Hide()
|
self.check:Hide()
|
||||||
table.insert(contentFrameCache, self)
|
tinsert(contentFrameCache, self)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function ContentOnClick()
|
local function ContentOnClick()
|
||||||
@@ -35,7 +39,7 @@ do
|
|||||||
local function GetContentLine()
|
local function GetContentLine()
|
||||||
local frame
|
local frame
|
||||||
if next(contentFrameCache) then
|
if next(contentFrameCache) then
|
||||||
frame = table.remove(contentFrameCache)
|
frame = tremove(contentFrameCache)
|
||||||
else
|
else
|
||||||
frame = CreateFrame("Button", nil, UIParent)
|
frame = CreateFrame("Button", nil, UIParent)
|
||||||
--frame:SetWidth(200)
|
--frame:SetWidth(200)
|
||||||
@@ -145,7 +149,7 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function textSort(a,b)
|
local function textSort(a,b)
|
||||||
return string.upper(a) < string.upper(b)
|
return upper(a) < upper(b)
|
||||||
end
|
end
|
||||||
|
|
||||||
local sortedlist = {}
|
local sortedlist = {}
|
||||||
@@ -161,9 +165,9 @@ do
|
|||||||
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
|
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
|
||||||
self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
|
self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
|
||||||
for k, v in pairs(self.list) do
|
for k, v in pairs(self.list) do
|
||||||
sortedlist[getn(sortedlist)+1] = k
|
tinsert(sortedlist, k)
|
||||||
end
|
end
|
||||||
table.sort(sortedlist, textSort)
|
sort(sortedlist, textSort)
|
||||||
for i, k in ipairs(sortedlist) do
|
for i, k in ipairs(sortedlist) do
|
||||||
local f = GetContentLine()
|
local f = GetContentLine()
|
||||||
f.text:SetText(k)
|
f.text:SetText(k)
|
||||||
@@ -171,7 +175,7 @@ do
|
|||||||
f.check:Show()
|
f.check:Show()
|
||||||
end
|
end
|
||||||
f.obj = self
|
f.obj = self
|
||||||
self.dropdown:AddFrame(f)
|
self.dropdown:AddFrame(f, i)
|
||||||
end
|
end
|
||||||
wipe(sortedlist)
|
wipe(sortedlist)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ local Media = LibStub("LibSharedMedia-3.0")
|
|||||||
|
|
||||||
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
|
local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
|
||||||
|
|
||||||
|
local next, ipairs, pairs = next, ipairs, pairs
|
||||||
|
local upper = string.upper
|
||||||
|
local tinsert, sort, tremove = table.insert, table.sort, table.remove
|
||||||
|
|
||||||
do
|
do
|
||||||
local widgetType = "LSM30_Statusbar"
|
local widgetType = "LSM30_Statusbar"
|
||||||
local widgetVersion = 11
|
local widgetVersion = 11
|
||||||
@@ -15,7 +19,7 @@ do
|
|||||||
self:ClearAllPoints()
|
self:ClearAllPoints()
|
||||||
self:Hide()
|
self:Hide()
|
||||||
self.check:Hide()
|
self.check:Hide()
|
||||||
table.insert(contentFrameCache, self)
|
tinsert(contentFrameCache, self)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function ContentOnClick()
|
local function ContentOnClick()
|
||||||
@@ -29,7 +33,7 @@ do
|
|||||||
local function GetContentLine()
|
local function GetContentLine()
|
||||||
local frame
|
local frame
|
||||||
if next(contentFrameCache) then
|
if next(contentFrameCache) then
|
||||||
frame = table.remove(contentFrameCache)
|
frame = tremove(contentFrameCache)
|
||||||
else
|
else
|
||||||
frame = CreateFrame("Button", nil, UIParent)
|
frame = CreateFrame("Button", nil, UIParent)
|
||||||
--frame:SetWidth(200)
|
--frame:SetWidth(200)
|
||||||
@@ -129,7 +133,7 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function textSort(a,b)
|
local function textSort(a,b)
|
||||||
return string.upper(a) < string.upper(b)
|
return upper(a) < upper(b)
|
||||||
end
|
end
|
||||||
|
|
||||||
local sortedlist = {}
|
local sortedlist = {}
|
||||||
@@ -145,13 +149,12 @@ do
|
|||||||
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
|
self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
|
||||||
self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
|
self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
|
||||||
for k, v in pairs(self.list) do
|
for k, v in pairs(self.list) do
|
||||||
sortedlist[getn(sortedlist)+1] = k
|
tinsert(sortedlist, k)
|
||||||
end
|
end
|
||||||
table.sort(sortedlist, textSort)
|
sort(sortedlist, textSort)
|
||||||
for i, k in ipairs(sortedlist) do
|
for i, k in ipairs(sortedlist) do
|
||||||
local f = GetContentLine()
|
local f = GetContentLine()
|
||||||
f.text:SetText(k)
|
f.text:SetText(k)
|
||||||
--print(k)
|
|
||||||
if k == self.value then
|
if k == self.value then
|
||||||
f.check:Show()
|
f.check:Show()
|
||||||
end
|
end
|
||||||
@@ -160,7 +163,7 @@ do
|
|||||||
f.bar:SetTexture(statusbar)
|
f.bar:SetTexture(statusbar)
|
||||||
f.obj = self
|
f.obj = self
|
||||||
f.dropdown = self.dropdown
|
f.dropdown = self.dropdown
|
||||||
self.dropdown:AddFrame(f)
|
self.dropdown:AddFrame(f, i)
|
||||||
end
|
end
|
||||||
wipe(sortedlist)
|
wipe(sortedlist)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ local Media = LibStub("LibSharedMedia-3.0")
|
|||||||
|
|
||||||
AGSMW = AGSMW or {}
|
AGSMW = AGSMW or {}
|
||||||
|
|
||||||
|
local next, ipairs = next, ipairs
|
||||||
|
local tinsert, tremove = table.insert, table.remove
|
||||||
|
|
||||||
AceGUIWidgetLSMlists = {
|
AceGUIWidgetLSMlists = {
|
||||||
['font'] = Media:HashTable("font"),
|
['font'] = Media:HashTable("font"),
|
||||||
['sound'] = Media:HashTable("sound"),
|
['sound'] = Media:HashTable("sound"),
|
||||||
@@ -160,38 +163,36 @@ do
|
|||||||
self.slider:SetValue(self.slider:GetValue()+(15*dir*-1))
|
self.slider:SetValue(self.slider:GetValue()+(15*dir*-1))
|
||||||
end
|
end
|
||||||
|
|
||||||
local function AddFrame(self, frame)
|
local function AddFrame(self, frame, i)
|
||||||
frame:SetParent(self.contentframe)
|
frame:SetParent(self.contentframe)
|
||||||
frame:SetFrameStrata(self:GetFrameStrata())
|
frame:SetFrameStrata(self:GetFrameStrata())
|
||||||
frame:SetFrameLevel(self:GetFrameLevel() + 100)
|
frame:SetFrameLevel(self:GetFrameLevel() + 100)
|
||||||
|
|
||||||
if next(self.contentRepo) then
|
if next(self.contentRepo) then
|
||||||
frame:SetPoint("TOPLEFT", self.contentRepo[getn(self.contentRepo)], "BOTTOMLEFT", 0, 0)
|
frame:SetPoint("TOPLEFT", self.contentRepo[i-1], "BOTTOMLEFT", 0, 0)
|
||||||
frame:SetPoint("RIGHT", self.contentframe, "RIGHT", 0, 0)
|
|
||||||
self.contentframe:SetHeight(self.contentframe:GetHeight() + frame:GetHeight())
|
self.contentframe:SetHeight(self.contentframe:GetHeight() + frame:GetHeight())
|
||||||
self.contentRepo[getn(self.contentRepo)+1] = frame
|
|
||||||
else
|
else
|
||||||
self.contentframe:SetHeight(frame:GetHeight())
|
self.contentframe:SetHeight(frame:GetHeight())
|
||||||
frame:SetPoint("TOPLEFT", self.contentframe, "TOPLEFT", 0, 0)
|
frame:SetPoint("TOPLEFT", self.contentframe, 0, 0)
|
||||||
frame:SetPoint("RIGHT", self.contentframe, "RIGHT", 0, 0)
|
|
||||||
self.contentRepo[1] = frame
|
|
||||||
end
|
end
|
||||||
|
self.contentRepo[i] = frame
|
||||||
|
|
||||||
if self.contentframe:GetHeight() > UIParent:GetHeight()*2/5 - 20 then
|
if self.contentframe:GetHeight() > GetScreenHeight()*2/5 - 20 then
|
||||||
self.scrollframe:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -28, 12)
|
self.scrollframe:SetWidth(128)
|
||||||
self:SetHeight(UIParent:GetHeight()*2/5)
|
self:SetHeight(GetScreenHeight()*2/5)
|
||||||
self.slider:Show()
|
self.slider:Show()
|
||||||
self:SetScript("OnMouseWheel", OnMouseWheel)
|
self:SetScript("OnMouseWheel", function() OnMouseWheel(this, arg1) end)
|
||||||
self.scrollframe:UpdateScrollChildRect()
|
self.scrollframe:UpdateScrollChildRect()
|
||||||
self.slider:SetMinMaxValues(0, self.contentframe:GetHeight()-self.scrollframe:GetHeight())
|
self.slider:SetMinMaxValues(0, self.contentframe:GetHeight()-self.scrollframe:GetHeight())
|
||||||
else
|
else
|
||||||
self.scrollframe:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -14, 12)
|
self.scrollframe:SetWidth(142)
|
||||||
self:SetHeight(self.contentframe:GetHeight()+25)
|
self:SetHeight(self.contentframe:GetHeight()+25)
|
||||||
self.slider:Hide()
|
self.slider:Hide()
|
||||||
self:SetScript("OnMouseWheel", nil)
|
self:SetScript("OnMouseWheel", nil)
|
||||||
self.scrollframe:UpdateScrollChildRect()
|
self.scrollframe:UpdateScrollChildRect()
|
||||||
self.slider:SetMinMaxValues(0, 0)
|
self.slider:SetMinMaxValues(0, 0)
|
||||||
end
|
end
|
||||||
|
frame:SetWidth(self.scrollframe:GetWidth())
|
||||||
self.contentframe:SetWidth(self.scrollframe:GetWidth())
|
self.contentframe:SetWidth(self.scrollframe:GetWidth())
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -210,7 +211,7 @@ do
|
|||||||
function AGSMW:GetDropDownFrame()
|
function AGSMW:GetDropDownFrame()
|
||||||
local frame
|
local frame
|
||||||
if next(DropDownCache) then
|
if next(DropDownCache) then
|
||||||
frame = table.remove(DropDownCache)
|
frame = tremove(DropDownCache)
|
||||||
else
|
else
|
||||||
frame = CreateFrame("Frame", nil, UIParent)
|
frame = CreateFrame("Frame", nil, UIParent)
|
||||||
frame:SetClampedToScreen(true)
|
frame:SetClampedToScreen(true)
|
||||||
@@ -225,14 +226,13 @@ do
|
|||||||
frame.contentframe = contentframe
|
frame.contentframe = contentframe
|
||||||
|
|
||||||
local scrollframe = CreateFrame("ScrollFrame", nil, frame)
|
local scrollframe = CreateFrame("ScrollFrame", nil, frame)
|
||||||
scrollframe:SetWidth(160)
|
scrollframe:SetWidth(128)
|
||||||
|
scrollframe:SetHeight((GetScreenHeight()*2/5) - 24)
|
||||||
scrollframe:SetPoint("TOPLEFT", frame, "TOPLEFT", 14, -13)
|
scrollframe:SetPoint("TOPLEFT", frame, "TOPLEFT", 14, -13)
|
||||||
scrollframe:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -14, 12)
|
|
||||||
scrollframe:SetScrollChild(contentframe)
|
scrollframe:SetScrollChild(contentframe)
|
||||||
frame.scrollframe = scrollframe
|
frame.scrollframe = scrollframe
|
||||||
|
|
||||||
contentframe:SetPoint("TOPLEFT", scrollframe)
|
contentframe:SetPoint("TOPLEFT", scrollframe)
|
||||||
contentframe:SetPoint("TOPRIGHT", scrollframe)
|
|
||||||
|
|
||||||
local bgTex = frame:CreateTexture(nil, "ARTWORK")
|
local bgTex = frame:CreateTexture(nil, "ARTWORK")
|
||||||
bgTex:SetAllPoints(scrollframe)
|
bgTex:SetAllPoints(scrollframe)
|
||||||
@@ -255,7 +255,7 @@ do
|
|||||||
slider:SetScript("OnValueChanged", slider_OnValueChanged)
|
slider:SetScript("OnValueChanged", slider_OnValueChanged)
|
||||||
frame.slider = slider
|
frame.slider = slider
|
||||||
end
|
end
|
||||||
frame:SetHeight(UIParent:GetHeight()*2/5)
|
frame:SetHeight(GetScreenHeight()*2/5)
|
||||||
frame.slider:SetValue(0)
|
frame.slider:SetValue(0)
|
||||||
frame:Show()
|
frame:Show()
|
||||||
return frame
|
return frame
|
||||||
@@ -267,7 +267,7 @@ do
|
|||||||
frame:Hide()
|
frame:Hide()
|
||||||
frame:SetBackdrop(frameBackdrop)
|
frame:SetBackdrop(frameBackdrop)
|
||||||
frame.bgTex:SetTexture(nil)
|
frame.bgTex:SetTexture(nil)
|
||||||
table.insert(DropDownCache, frame)
|
tinsert(DropDownCache, frame)
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
WidgetBase.Fire = function(self, name, argc, ...)
|
WidgetBase.Fire = function(self, name, argc, ...)
|
||||||
argc = table.getn(arg)
|
argc = arg.n
|
||||||
local func = self.events[name]
|
local func = self.events[name]
|
||||||
if func then
|
if func then
|
||||||
local success, ret = safecall(func, argc+3, self, name, argc, unpack(arg))
|
local success, ret = safecall(func, argc+3, self, name, argc, unpack(arg))
|
||||||
@@ -310,8 +310,8 @@ do
|
|||||||
AceGUI:Release(self)
|
AceGUI:Release(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
WidgetBase.SetPoint = function(self,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
|
WidgetBase.SetPoint = function(self, a1,a2,a3,a4,a5)
|
||||||
return self.frame:SetPoint(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
|
return self.frame:SetPoint(a1,a2,a3,a4,a5)
|
||||||
end
|
end
|
||||||
|
|
||||||
WidgetBase.ClearAllPoints = function(self)
|
WidgetBase.ClearAllPoints = function(self)
|
||||||
@@ -322,8 +322,8 @@ do
|
|||||||
return self.frame:GetNumPoints()
|
return self.frame:GetNumPoints()
|
||||||
end
|
end
|
||||||
|
|
||||||
WidgetBase.GetPoint = function(self,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
|
WidgetBase.GetPoint = function(self, a1,a2,a3,a4,a5)
|
||||||
return self.frame:GetPoint(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)
|
return self.frame:GetPoint(a1,a2,a3,a4,a5)
|
||||||
end
|
end
|
||||||
|
|
||||||
WidgetBase.GetUserDataTable = function(self)
|
WidgetBase.GetUserDataTable = function(self)
|
||||||
|
|||||||
@@ -325,7 +325,7 @@ local methods = {
|
|||||||
|
|
||||||
local button = CreateFrame("Button", strfmt("AceGUI30TreeButton%d", num), self.treeframe)
|
local button = CreateFrame("Button", strfmt("AceGUI30TreeButton%d", num), self.treeframe)
|
||||||
button.obj = self
|
button.obj = self
|
||||||
button:SetWidth(175)
|
button:SetWidth(DEFAULT_TREE_WIDTH)
|
||||||
button:SetHeight(18)
|
button:SetHeight(18)
|
||||||
|
|
||||||
local toggle = CreateFrame("Button", "$parentToggle", button)
|
local toggle = CreateFrame("Button", "$parentToggle", button)
|
||||||
@@ -419,7 +419,6 @@ local methods = {
|
|||||||
end,
|
end,
|
||||||
|
|
||||||
["RefreshTree"] = function(self,scrollToSelection)
|
["RefreshTree"] = function(self,scrollToSelection)
|
||||||
local t = GetTime()
|
|
||||||
local buttons = self.buttons
|
local buttons = self.buttons
|
||||||
local lines = self.lines
|
local lines = self.lines
|
||||||
|
|
||||||
@@ -500,6 +499,7 @@ local methods = {
|
|||||||
end
|
end
|
||||||
|
|
||||||
local buttonnum = 1
|
local buttonnum = 1
|
||||||
|
local treewidth = treeframe:GetWidth()
|
||||||
for i = first, last do
|
for i = first, last do
|
||||||
local line = lines[i]
|
local line = lines[i]
|
||||||
local button = buttons[buttonnum]
|
local button = buttons[buttonnum]
|
||||||
@@ -509,19 +509,20 @@ local methods = {
|
|||||||
buttons[buttonnum] = button
|
buttons[buttonnum] = button
|
||||||
button:SetParent(treeframe)
|
button:SetParent(treeframe)
|
||||||
button:SetFrameLevel(treeframe:GetFrameLevel()+1)
|
button:SetFrameLevel(treeframe:GetFrameLevel()+1)
|
||||||
button:ClearAllPoints()
|
end
|
||||||
if buttonnum == 1 then
|
|
||||||
if self.showscroll then
|
button:ClearAllPoints()
|
||||||
button:SetPoint("TOPRIGHT", -22, -10)
|
if buttonnum == 1 then
|
||||||
button:SetPoint("TOPLEFT", 0, -10)
|
if self.showscroll then
|
||||||
else
|
button:SetWidth(treewidth - 22)
|
||||||
button:SetPoint("TOPRIGHT", 0, -10)
|
button:SetPoint("TOPRIGHT", -22, -10)
|
||||||
button:SetPoint("TOPLEFT", 0, -10)
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
button:SetPoint("TOPRIGHT", buttons[buttonnum-1], "BOTTOMRIGHT",0,0)
|
button:SetWidth(treewidth)
|
||||||
button:SetPoint("TOPLEFT", buttons[buttonnum-1], "BOTTOMLEFT",0,0)
|
button:SetPoint("TOPRIGHT", 0, -10)
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
button:SetWidth(self.showscroll and (treewidth - 22) or treewidth)
|
||||||
|
button:SetPoint("TOPRIGHT", buttons[buttonnum-1], "BOTTOMRIGHT",0,0)
|
||||||
end
|
end
|
||||||
|
|
||||||
UpdateButton(button, line, status.selected == line.uniquevalue, line.hasChildren, groupstatus[line.uniquevalue] )
|
UpdateButton(button, line, status.selected == line.uniquevalue, line.hasChildren, groupstatus[line.uniquevalue] )
|
||||||
@@ -542,7 +543,7 @@ local methods = {
|
|||||||
self.filter = false
|
self.filter = false
|
||||||
local status = self.status or self.localstatus
|
local status = self.status or self.localstatus
|
||||||
local groups = status.groups
|
local groups = status.groups
|
||||||
for i = 1, tgetn(arg) do
|
for i = 1, arg.n do
|
||||||
groups[tconcat(arg, "\001", 1, i)] = true
|
groups[tconcat(arg, "\001", 1, i)] = true
|
||||||
end
|
end
|
||||||
status.selected = uniquevalue
|
status.selected = uniquevalue
|
||||||
@@ -563,11 +564,13 @@ local methods = {
|
|||||||
if show then
|
if show then
|
||||||
self.scrollbar:Show()
|
self.scrollbar:Show()
|
||||||
if self.buttons[1] then
|
if self.buttons[1] then
|
||||||
|
self.buttons[1]:SetWidth(self.treeframe:GetWidth() - 22)
|
||||||
self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",-22,-10)
|
self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",-22,-10)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
self.scrollbar:Hide()
|
self.scrollbar:Hide()
|
||||||
if self.buttons[1] then
|
if self.buttons[1] then
|
||||||
|
self.buttons[1]:SetWidth(self.treeframe:GetWidth())
|
||||||
self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",0,-10)
|
self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",0,-10)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -107,7 +107,6 @@ do
|
|||||||
end
|
end
|
||||||
child:ClearAllPoints()
|
child:ClearAllPoints()
|
||||||
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
|
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
|
||||||
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
|
|
||||||
status.offset = offset
|
status.offset = offset
|
||||||
status.scrollvalue = value
|
status.scrollvalue = value
|
||||||
end
|
end
|
||||||
@@ -151,7 +150,6 @@ do
|
|||||||
if value < 1000 then
|
if value < 1000 then
|
||||||
child:ClearAllPoints()
|
child:ClearAllPoints()
|
||||||
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
|
child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
|
||||||
child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -12, offset)
|
|
||||||
status.offset = offset
|
status.offset = offset
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -324,16 +322,17 @@ do
|
|||||||
slider.obj = self
|
slider.obj = self
|
||||||
|
|
||||||
scrollFrame:SetScrollChild(itemFrame)
|
scrollFrame:SetScrollChild(itemFrame)
|
||||||
|
scrollFrame:SetWidth(defaultWidth - 12)
|
||||||
|
scrollFrame:SetHeight(self.maxHeight - 24)
|
||||||
scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
|
scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
|
||||||
scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
|
|
||||||
scrollFrame:EnableMouseWheel(true)
|
scrollFrame:EnableMouseWheel(true)
|
||||||
scrollFrame:SetScript("OnMouseWheel", OnMouseWheel)
|
scrollFrame:SetScript("OnMouseWheel", OnMouseWheel)
|
||||||
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
|
scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
|
||||||
scrollFrame:SetToplevel(true)
|
scrollFrame:SetToplevel(true)
|
||||||
scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
|
scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
|
|
||||||
|
itemFrame:SetWidth(defaultWidth - 12)
|
||||||
itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
|
itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
|
||||||
itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
|
|
||||||
itemFrame:SetHeight(400)
|
itemFrame:SetHeight(400)
|
||||||
itemFrame:SetToplevel(true)
|
itemFrame:SetToplevel(true)
|
||||||
itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
|
itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||||
@@ -392,7 +391,10 @@ do
|
|||||||
AceGUI:ClearFocus()
|
AceGUI:ClearFocus()
|
||||||
else
|
else
|
||||||
self.open = true
|
self.open = true
|
||||||
self.pullout:SetWidth(self.pulloutWidth or self.frame:GetWidth())
|
local width = self.pulloutWidth or self.frame:GetWidth()
|
||||||
|
self.pullout:SetWidth(width)
|
||||||
|
self.pullout.scrollFrame:SetWidth(width - 12)
|
||||||
|
self.pullout.itemFrame:SetWidth(width - (self.pullout.slider:IsShown() and 24 or 12))
|
||||||
self.pullout:Open("TOPLEFT", self.frame, "BOTTOMLEFT", 0, self.label:IsShown() and -2 or 0)
|
self.pullout:Open("TOPLEFT", self.frame, "BOTTOMLEFT", 0, self.label:IsShown() and -2 or 0)
|
||||||
AceGUI:SetFocus(self)
|
AceGUI:SetFocus(self)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -507,7 +507,7 @@ end
|
|||||||
E.Options.args.nameplate = {
|
E.Options.args.nameplate = {
|
||||||
type = "group",
|
type = "group",
|
||||||
name = L["NamePlates"],
|
name = L["NamePlates"],
|
||||||
childGroups = "tab",
|
childGroups = "tree",
|
||||||
get = function(info) return E.db.nameplates[ info[getn(info)] ] end,
|
get = function(info) return E.db.nameplates[ info[getn(info)] ] end,
|
||||||
set = function(info, value) E.db.nameplates[ info[getn(info)] ] = value; NP:ConfigureAll(); end,
|
set = function(info, value) E.db.nameplates[ info[getn(info)] ] = value; NP:ConfigureAll(); end,
|
||||||
args = {
|
args = {
|
||||||
|
|||||||
+134
-187
@@ -340,53 +340,53 @@ local function GetOptionsTable_AuraBars(friendlyOnly, updateFunc, groupName)
|
|||||||
updateFunc(UF, groupName)
|
updateFunc(UF, groupName)
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
config.args.filters.args.filterPriority = {
|
-- config.args.filters.args.filterPriority = {
|
||||||
order = 22,
|
-- order = 22,
|
||||||
dragdrop = true,
|
-- dragdrop = true,
|
||||||
type = "multiselect",
|
-- type = "multiselect",
|
||||||
name = L["Filter Priority"],
|
-- name = L["Filter Priority"],
|
||||||
dragOnLeave = function() end, --keep this here
|
-- dragOnLeave = function() end, --keep this here
|
||||||
dragOnEnter = function(info, value)
|
-- dragOnEnter = function(info, value)
|
||||||
carryFilterTo = info.obj.value
|
-- carryFilterTo = info.obj.value
|
||||||
end,
|
-- end,
|
||||||
dragOnMouseDown = function(info, value)
|
-- dragOnMouseDown = function(info, value)
|
||||||
carryFilterFrom, carryFilterTo = info.obj.value, nil
|
-- carryFilterFrom, carryFilterTo = info.obj.value, nil
|
||||||
end,
|
-- end,
|
||||||
dragOnMouseUp = function(info, value)
|
-- dragOnMouseUp = function(info, value)
|
||||||
filterPriority("aurabar", groupName, carryFilterTo, nil, carryFilterFrom) --add it in the new spot
|
-- filterPriority("aurabar", groupName, carryFilterTo, nil, carryFilterFrom) --add it in the new spot
|
||||||
carryFilterFrom, carryFilterTo = nil, nil
|
-- carryFilterFrom, carryFilterTo = nil, nil
|
||||||
end,
|
-- end,
|
||||||
dragOnClick = function(info, value)
|
-- dragOnClick = function(info, value)
|
||||||
filterPriority("aurabar", groupName, carryFilterFrom, true)
|
-- filterPriority("aurabar", groupName, carryFilterFrom, true)
|
||||||
end,
|
-- end,
|
||||||
stateSwitchGetText = function(button, text, value)
|
-- stateSwitchGetText = function(button, text, value)
|
||||||
local friend, enemy = match(text, "^Friendly:([^,]*)"), match(text, "^Enemy:([^,]*)")
|
-- local friend, enemy = match(text, "^Friendly:([^,]*)"), match(text, "^Enemy:([^,]*)")
|
||||||
return (friend and format("|cFF33FF33%s|r %s", L["Friend"], friend)) or (enemy and format("|cFFFF3333%s|r %s", L["Enemy"], enemy))
|
-- return (friend and format("|cFF33FF33%s|r %s", L["Friend"], friend)) or (enemy and format("|cFFFF3333%s|r %s", L["Enemy"], enemy))
|
||||||
end,
|
-- end,
|
||||||
stateSwitchOnClick = function(info, value)
|
-- stateSwitchOnClick = function(info, value)
|
||||||
filterPriority("aurabar", groupName, carryFilterFrom, nil, nil, true)
|
-- filterPriority("aurabar", groupName, carryFilterFrom, nil, nil, true)
|
||||||
end,
|
-- end,
|
||||||
values = function()
|
-- values = function()
|
||||||
local str = E.db.unitframe.units[groupName].aurabar.priority
|
-- local str = E.db.unitframe.units[groupName].aurabar.priority
|
||||||
if str == "" then return nil end
|
-- if str == "" then return nil end
|
||||||
return {strsplit(",",str)}
|
-- return {strsplit(",",str)}
|
||||||
end,
|
-- end,
|
||||||
get = function(info, value)
|
-- get = function(info, value)
|
||||||
local str = E.db.unitframe.units[groupName].aurabar.priority
|
-- local str = E.db.unitframe.units[groupName].aurabar.priority
|
||||||
if str == "" then return nil end
|
-- if str == "" then return nil end
|
||||||
local tbl = {strsplit(",",str)}
|
-- local tbl = {strsplit(",",str)}
|
||||||
return tbl[value]
|
-- return tbl[value]
|
||||||
end,
|
-- end,
|
||||||
set = function(info, value)
|
-- set = function(info, value)
|
||||||
E.db.unitframe.units[groupName].aurabar[ info[getn(info)] ] = nil -- this was being set when drag and drop was first added, setting it to nil to clear tester profiles of this variable
|
-- E.db.unitframe.units[groupName].aurabar[ info[getn(info)] ] = nil -- this was being set when drag and drop was first added, setting it to nil to clear tester profiles of this variable
|
||||||
updateFunc(UF, groupName)
|
-- updateFunc(UF, groupName)
|
||||||
end
|
-- end
|
||||||
}
|
-- }
|
||||||
config.args.filters.args.spacer1 = {
|
-- config.args.filters.args.spacer1 = {
|
||||||
order = 23,
|
-- order = 23,
|
||||||
type = "description",
|
-- type = "description",
|
||||||
name = L["Use drag and drop to rearrange filter priority or right click to remove a filter."].."\n"..L["Use Shift+LeftClick to toggle between friendly or enemy or normal state. Normal state will allow the filter to be checked on all units. Friendly state is for friendly units only and enemy state is for enemy units."],
|
-- name = L["Use drag and drop to rearrange filter priority or right click to remove a filter."].."\n"..L["Use Shift+LeftClick to toggle between friendly or enemy or normal state. Normal state will allow the filter to be checked on all units. Friendly state is for friendly units only and enemy state is for enemy units."],
|
||||||
}
|
-- }
|
||||||
|
|
||||||
return config
|
return config
|
||||||
end
|
end
|
||||||
@@ -589,58 +589,58 @@ local function GetOptionsTable_Auras(friendlyUnitOnly, auraType, isGroupFrame, u
|
|||||||
updateFunc(UF, groupName, numUnits)
|
updateFunc(UF, groupName, numUnits)
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
config.args.filters.args.filterPriority = {
|
-- config.args.filters.args.filterPriority = {
|
||||||
order = 22,
|
-- order = 22,
|
||||||
dragdrop = true,
|
-- dragdrop = true,
|
||||||
type = "multiselect",
|
-- type = "multiselect",
|
||||||
name = L["Filter Priority"],
|
-- name = L["Filter Priority"],
|
||||||
dragOnLeave = function() end, --keep this here
|
-- dragOnLeave = function() end, --keep this here
|
||||||
dragOnEnter = function(info, value)
|
-- dragOnEnter = function(info, value)
|
||||||
carryFilterTo = info.obj.value
|
-- carryFilterTo = info.obj.value
|
||||||
end,
|
-- end,
|
||||||
dragOnMouseDown = function(info, value)
|
-- dragOnMouseDown = function(info, value)
|
||||||
carryFilterFrom, carryFilterTo = info.obj.value, nil
|
-- carryFilterFrom, carryFilterTo = info.obj.value, nil
|
||||||
end,
|
-- end,
|
||||||
dragOnMouseUp = function(info, value)
|
-- dragOnMouseUp = function(info, value)
|
||||||
filterPriority(auraType, groupName, carryFilterTo, nil, carryFilterFrom) --add it in the new spot
|
-- filterPriority(auraType, groupName, carryFilterTo, nil, carryFilterFrom) --add it in the new spot
|
||||||
carryFilterFrom, carryFilterTo = nil, nil
|
-- carryFilterFrom, carryFilterTo = nil, nil
|
||||||
end,
|
-- end,
|
||||||
dragOnClick = function(info, value)
|
-- dragOnClick = function(info, value)
|
||||||
filterPriority(auraType, groupName, carryFilterFrom, true)
|
-- filterPriority(auraType, groupName, carryFilterFrom, true)
|
||||||
end,
|
-- end,
|
||||||
stateSwitchGetText = function(button, text, value)
|
-- stateSwitchGetText = function(button, text, value)
|
||||||
local friend, enemy = match(text, "^Friendly:([^,]*)"), match(text, "^Enemy:([^,]*)")
|
-- local friend, enemy = match(text, "^Friendly:([^,]*)"), match(text, "^Enemy:([^,]*)")
|
||||||
return (friend and format("|cFF33FF33%s|r %s", L["Friend"], friend)) or (enemy and format("|cFFFF3333%s|r %s", L["Enemy"], enemy))
|
-- return (friend and format("|cFF33FF33%s|r %s", L["Friend"], friend)) or (enemy and format("|cFFFF3333%s|r %s", L["Enemy"], enemy))
|
||||||
end,
|
-- end,
|
||||||
stateSwitchOnClick = function(info, value)
|
-- stateSwitchOnClick = function(info, value)
|
||||||
filterPriority(auraType, groupName, carryFilterFrom, nil, nil, true)
|
-- filterPriority(auraType, groupName, carryFilterFrom, nil, nil, true)
|
||||||
end,
|
-- end,
|
||||||
values = function()
|
-- values = function()
|
||||||
local str = E.db.unitframe.units[groupName][auraType].priority
|
-- local str = E.db.unitframe.units[groupName][auraType].priority
|
||||||
if str == "" then return nil end
|
-- if str == "" then return nil end
|
||||||
return {strsplit(",",str)}
|
-- return {strsplit(",",str)}
|
||||||
end,
|
-- end,
|
||||||
get = function(info, value)
|
-- get = function(info, value)
|
||||||
local str = E.db.unitframe.units[groupName][auraType].priority
|
-- local str = E.db.unitframe.units[groupName][auraType].priority
|
||||||
if str == "" then return nil end
|
-- if str == "" then return nil end
|
||||||
local tbl = {strsplit(",",str)}
|
-- local tbl = {strsplit(",",str)}
|
||||||
return tbl[value]
|
-- return tbl[value]
|
||||||
end,
|
-- end,
|
||||||
set = function(info, value)
|
-- set = function(info, value)
|
||||||
E.db.unitframe.units[groupName][auraType][ info[getn(info)] ] = nil -- this was being set when drag and drop was first added, setting it to nil to clear tester profiles of this variable
|
-- E.db.unitframe.units[groupName][auraType][ info[getn(info)] ] = nil -- this was being set when drag and drop was first added, setting it to nil to clear tester profiles of this variable
|
||||||
updateFunc(UF, groupName, numUnits)
|
-- updateFunc(UF, groupName, numUnits)
|
||||||
end
|
-- end
|
||||||
}
|
-- }
|
||||||
config.args.filters.args.spacer1 = {
|
-- config.args.filters.args.spacer1 = {
|
||||||
order = 23,
|
-- order = 23,
|
||||||
type = "description",
|
-- type = "description",
|
||||||
name = L["Use drag and drop to rearrange filter priority or right click to remove a filter."].."\n"..L["Use Shift+LeftClick to toggle between friendly or enemy or normal state. Normal state will allow the filter to be checked on all units. Friendly state is for friendly units only and enemy state is for enemy units."],
|
-- name = L["Use drag and drop to rearrange filter priority or right click to remove a filter."].."\n"..L["Use Shift+LeftClick to toggle between friendly or enemy or normal state. Normal state will allow the filter to be checked on all units. Friendly state is for friendly units only and enemy state is for enemy units."],
|
||||||
}
|
-- }
|
||||||
|
|
||||||
return config
|
return config
|
||||||
end
|
end
|
||||||
|
|
||||||
local function GetOptionsTable_Castbar(hasTicks, updateFunc, groupName, numUnits)
|
local function GetOptionsTable_Castbar(updateFunc, groupName, numUnits)
|
||||||
local config = {
|
local config = {
|
||||||
order = 800,
|
order = 800,
|
||||||
type = "group",
|
type = "group",
|
||||||
@@ -668,7 +668,7 @@ local function GetOptionsTable_Castbar(hasTicks, updateFunc, groupName, numUnits
|
|||||||
frameName = gsub(frameName, "t(arget)", "T%1")
|
frameName = gsub(frameName, "t(arget)", "T%1")
|
||||||
|
|
||||||
if numUnits then
|
if numUnits then
|
||||||
for i=1, numUnits do
|
for i = 1, numUnits do
|
||||||
local castbar = _G[frameName..i].Castbar
|
local castbar = _G[frameName..i].Castbar
|
||||||
if not castbar.oldHide then
|
if not castbar.oldHide then
|
||||||
castbar.oldHide = castbar.Hide
|
castbar.oldHide = castbar.Hide
|
||||||
@@ -697,59 +697,54 @@ local function GetOptionsTable_Castbar(hasTicks, updateFunc, groupName, numUnits
|
|||||||
},
|
},
|
||||||
configureButton = {
|
configureButton = {
|
||||||
order = 4,
|
order = 4,
|
||||||
|
type = "execute",
|
||||||
name = L["Coloring"],
|
name = L["Coloring"],
|
||||||
desc = L["This opens the UnitFrames Color settings. These settings affect all unitframes."],
|
desc = L["This opens the UnitFrames Color settings. These settings affect all unitframes."],
|
||||||
type = "execute",
|
func = function() ACD:SelectGroup("ElvUI", "unitframe", "generalOptionsGroup", "allColorsGroup", "castBars") end
|
||||||
func = function() ACD:SelectGroup("ElvUI", "unitframe", "generalOptionsGroup", "allColorsGroup", "castBars") end,
|
|
||||||
},
|
},
|
||||||
enable = {
|
enable = {
|
||||||
type = "toggle",
|
|
||||||
order = 5,
|
order = 5,
|
||||||
name = L["Enable"],
|
type = "toggle",
|
||||||
|
name = L["Enable"]
|
||||||
},
|
},
|
||||||
width = {
|
width = {
|
||||||
order = 6,
|
order = 6,
|
||||||
name = L["Width"],
|
|
||||||
type = "range",
|
type = "range",
|
||||||
|
name = L["Width"],
|
||||||
softMax = 600,
|
softMax = 600,
|
||||||
min = 50, max = GetScreenWidth(), step = 1,
|
min = 50, max = GetScreenWidth(), step = 1
|
||||||
},
|
},
|
||||||
height = {
|
height = {
|
||||||
order = 7,
|
order = 7,
|
||||||
name = L["Height"],
|
|
||||||
type = "range",
|
type = "range",
|
||||||
min = 10, max = 85, step = 1,
|
name = L["Height"],
|
||||||
},
|
min = 10, max = 85, step = 1
|
||||||
latency = {
|
|
||||||
order = 8,
|
|
||||||
name = L["Latency"],
|
|
||||||
type = "toggle",
|
|
||||||
},
|
},
|
||||||
format = {
|
format = {
|
||||||
order = 9,
|
order = 8,
|
||||||
type = "select",
|
type = "select",
|
||||||
name = L["Format"],
|
name = L["Format"],
|
||||||
values = {
|
values = {
|
||||||
["CURRENTMAX"] = L["Current / Max"],
|
["CURRENTMAX"] = L["Current / Max"],
|
||||||
["CURRENT"] = L["Current"],
|
["CURRENT"] = L["Current"],
|
||||||
["REMAINING"] = L["Remaining"],
|
["REMAINING"] = L["Remaining"]
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
spark = {
|
spark = {
|
||||||
order = 10,
|
order = 9,
|
||||||
type = "toggle",
|
type = "toggle",
|
||||||
name = L["Spark"],
|
name = L["Spark"],
|
||||||
desc = L["Display a spark texture at the end of the castbar statusbar to help show the differance between castbar and backdrop."],
|
desc = L["Display a spark texture at the end of the castbar statusbar to help show the differance between castbar and backdrop."]
|
||||||
},
|
},
|
||||||
insideInfoPanel = {
|
insideInfoPanel = {
|
||||||
order = 11,
|
order = 10,
|
||||||
|
type = "toggle",
|
||||||
name = L["Inside Information Panel"],
|
name = L["Inside Information Panel"],
|
||||||
desc = L["Display the castbar inside the information panel, the icon will be displayed outside the main unitframe."],
|
desc = L["Display the castbar inside the information panel, the icon will be displayed outside the main unitframe."],
|
||||||
type = "toggle",
|
disabled = function() return not E.db.unitframe.units[groupName].infoPanel or not E.db.unitframe.units[groupName].infoPanel.enable end
|
||||||
disabled = function() return not E.db.unitframe.units[groupName].infoPanel or not E.db.unitframe.units[groupName].infoPanel.enable end,
|
|
||||||
},
|
},
|
||||||
iconSettings = {
|
iconSettings = {
|
||||||
order = 13,
|
order = 11,
|
||||||
type = "group",
|
type = "group",
|
||||||
name = L["Icon"],
|
name = L["Icon"],
|
||||||
guiInline = true,
|
guiInline = true,
|
||||||
@@ -758,22 +753,22 @@ local function GetOptionsTable_Castbar(hasTicks, updateFunc, groupName, numUnits
|
|||||||
args = {
|
args = {
|
||||||
icon = {
|
icon = {
|
||||||
order = 1,
|
order = 1,
|
||||||
name = L["Enable"],
|
|
||||||
type = "toggle",
|
type = "toggle",
|
||||||
|
name = L["Enable"]
|
||||||
},
|
},
|
||||||
iconAttached = {
|
iconAttached = {
|
||||||
order = 2,
|
order = 2,
|
||||||
name = L["Icon Inside Castbar"],
|
|
||||||
desc = L["Display the castbar icon inside the castbar."],
|
|
||||||
type = "toggle",
|
type = "toggle",
|
||||||
|
name = L["Icon Inside Castbar"],
|
||||||
|
desc = L["Display the castbar icon inside the castbar."]
|
||||||
},
|
},
|
||||||
iconSize = {
|
iconSize = {
|
||||||
order = 3,
|
order = 3,
|
||||||
|
type = "range",
|
||||||
name = L["Icon Size"],
|
name = L["Icon Size"],
|
||||||
desc = L["This dictates the size of the icon when it is not attached to the castbar."],
|
desc = L["This dictates the size of the icon when it is not attached to the castbar."],
|
||||||
type = "range",
|
|
||||||
disabled = function() return E.db.unitframe.units[groupName].castbar.iconAttached end,
|
disabled = function() return E.db.unitframe.units[groupName].castbar.iconAttached end,
|
||||||
min = 8, max = 150, step = 1,
|
min = 8, max = 150, step = 1
|
||||||
},
|
},
|
||||||
iconAttachedTo = {
|
iconAttachedTo = {
|
||||||
order = 4,
|
order = 4,
|
||||||
@@ -782,86 +777,38 @@ local function GetOptionsTable_Castbar(hasTicks, updateFunc, groupName, numUnits
|
|||||||
disabled = function() return E.db.unitframe.units[groupName].castbar.iconAttached end,
|
disabled = function() return E.db.unitframe.units[groupName].castbar.iconAttached end,
|
||||||
values = {
|
values = {
|
||||||
["Frame"] = L["Frame"],
|
["Frame"] = L["Frame"],
|
||||||
["Castbar"] = L["Castbar"],
|
["Castbar"] = L["Castbar"]
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
iconPosition = {
|
iconPosition = {
|
||||||
type = "select",
|
type = "select",
|
||||||
order = 5,
|
order = 5,
|
||||||
name = L["Position"],
|
name = L["Position"],
|
||||||
values = positionValues,
|
values = positionValues,
|
||||||
disabled = function() return E.db.unitframe.units[groupName].castbar.iconAttached end,
|
disabled = function() return E.db.unitframe.units[groupName].castbar.iconAttached end
|
||||||
},
|
},
|
||||||
iconXOffset = {
|
iconXOffset = {
|
||||||
order = 5,
|
order = 5,
|
||||||
type = "range",
|
type = "range",
|
||||||
name = L["xOffset"],
|
name = L["xOffset"],
|
||||||
min = -300, max = 300, step = 1,
|
min = -300, max = 300, step = 1,
|
||||||
disabled = function() return E.db.unitframe.units[groupName].castbar.iconAttached end,
|
disabled = function() return E.db.unitframe.units[groupName].castbar.iconAttached end
|
||||||
},
|
},
|
||||||
iconYOffset = {
|
iconYOffset = {
|
||||||
order = 6,
|
order = 6,
|
||||||
type = "range",
|
type = "range",
|
||||||
name = L["yOffset"],
|
name = L["yOffset"],
|
||||||
min = -300, max = 300, step = 1,
|
min = -300, max = 300, step = 1,
|
||||||
disabled = function() return E.db.unitframe.units[groupName].castbar.iconAttached end,
|
disabled = function() return E.db.unitframe.units[groupName].castbar.iconAttached end
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if hasTicks then
|
|
||||||
config.args.displayTarget = {
|
|
||||||
order = 11,
|
|
||||||
type = "toggle",
|
|
||||||
name = L["Display Target"],
|
|
||||||
desc = L["Display the target of your current cast. Useful for mouseover casts."],
|
|
||||||
}
|
|
||||||
|
|
||||||
config.args.ticks = {
|
|
||||||
order = 12,
|
|
||||||
type = "group",
|
|
||||||
guiInline = true,
|
|
||||||
name = L["Ticks"],
|
|
||||||
args = {
|
|
||||||
ticks = {
|
|
||||||
order = 1,
|
|
||||||
type = 'toggle',
|
|
||||||
name = L["Ticks"],
|
|
||||||
desc = L["Display tick marks on the castbar for channelled spells. This will adjust automatically for spells like Drain Soul and add additional ticks based on haste."],
|
|
||||||
},
|
|
||||||
tickColor = {
|
|
||||||
order = 2,
|
|
||||||
type = "color",
|
|
||||||
name = COLOR,
|
|
||||||
hasAlpha = true,
|
|
||||||
get = function(info)
|
|
||||||
local c = E.db.unitframe.units[groupName].castbar.tickColor
|
|
||||||
local d = P.unitframe.units[groupName].castbar.tickColor
|
|
||||||
return c.r, c.g, c.b, c.a, d.r, d.g, d.b, d.a
|
|
||||||
end,
|
|
||||||
set = function(info, r, g, b, a)
|
|
||||||
local c = E.db.unitframe.units[groupName].castbar.tickColor
|
|
||||||
c.r, c.g, c.b, c.a = r, g, b, a
|
|
||||||
updateFunc(UF, groupName, numUnits)
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
tickWidth = {
|
|
||||||
order = 3,
|
|
||||||
type = "range",
|
|
||||||
name = L["Width"],
|
|
||||||
min = 1, max = 20, step = 1,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
return config
|
return config
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function GetOptionsTable_InformationPanel(updateFunc, groupName, numUnits)
|
local function GetOptionsTable_InformationPanel(updateFunc, groupName, numUnits)
|
||||||
|
|
||||||
local config = {
|
local config = {
|
||||||
@@ -1904,7 +1851,7 @@ end
|
|||||||
E.Options.args.unitframe = {
|
E.Options.args.unitframe = {
|
||||||
type = "group",
|
type = "group",
|
||||||
name = L["UnitFrames"],
|
name = L["UnitFrames"],
|
||||||
childGroups = "tab",
|
childGroups = "tree",
|
||||||
get = function(info) return E.db.unitframe[ info[getn(info)] ] end,
|
get = function(info) return E.db.unitframe[ info[getn(info)] ] end,
|
||||||
set = function(info, value) E.db.unitframe[ info[getn(info)] ] = value end,
|
set = function(info, value) E.db.unitframe[ info[getn(info)] ] = value end,
|
||||||
args = {
|
args = {
|
||||||
@@ -2734,10 +2681,10 @@ E.Options.args.unitframe.args.player = {
|
|||||||
power = GetOptionsTable_Power(true, UF.CreateAndUpdateUF, "player", nil, true),
|
power = GetOptionsTable_Power(true, UF.CreateAndUpdateUF, "player", nil, true),
|
||||||
name = GetOptionsTable_Name(UF.CreateAndUpdateUF, "player"),
|
name = GetOptionsTable_Name(UF.CreateAndUpdateUF, "player"),
|
||||||
portrait = GetOptionsTable_Portrait(UF.CreateAndUpdateUF, "player"),
|
portrait = GetOptionsTable_Portrait(UF.CreateAndUpdateUF, "player"),
|
||||||
--buffs = GetOptionsTable_Auras(true, "buffs", false, UF.CreateAndUpdateUF, "player"),
|
buffs = GetOptionsTable_Auras(true, "buffs", false, UF.CreateAndUpdateUF, "player"),
|
||||||
--debuffs = GetOptionsTable_Auras(true, "debuffs", false, UF.CreateAndUpdateUF, "player"),
|
debuffs = GetOptionsTable_Auras(true, "debuffs", false, UF.CreateAndUpdateUF, "player"),
|
||||||
castbar = GetOptionsTable_Castbar(true, UF.CreateAndUpdateUF, "player"),
|
castbar = GetOptionsTable_Castbar(UF.CreateAndUpdateUF, "player"),
|
||||||
--aurabar = GetOptionsTable_AuraBars(true, UF.CreateAndUpdateUF, "player"),
|
aurabar = GetOptionsTable_AuraBars(true, UF.CreateAndUpdateUF, "player"),
|
||||||
raidicon = GetOptionsTable_RaidIcon(UF.CreateAndUpdateUF, "player"),
|
raidicon = GetOptionsTable_RaidIcon(UF.CreateAndUpdateUF, "player"),
|
||||||
classbar = {
|
classbar = {
|
||||||
order = 1000,
|
order = 1000,
|
||||||
@@ -3097,7 +3044,7 @@ E.Options.args.unitframe.args.target = {
|
|||||||
portrait = GetOptionsTable_Portrait(UF.CreateAndUpdateUF, "target"),
|
portrait = GetOptionsTable_Portrait(UF.CreateAndUpdateUF, "target"),
|
||||||
--buffs = GetOptionsTable_Auras(false, "buffs", false, UF.CreateAndUpdateUF, "target"),
|
--buffs = GetOptionsTable_Auras(false, "buffs", false, UF.CreateAndUpdateUF, "target"),
|
||||||
--debuffs = GetOptionsTable_Auras(false, "debuffs", false, UF.CreateAndUpdateUF, "target"),
|
--debuffs = GetOptionsTable_Auras(false, "debuffs", false, UF.CreateAndUpdateUF, "target"),
|
||||||
castbar = GetOptionsTable_Castbar(false, UF.CreateAndUpdateUF, "target"),
|
--castbar = GetOptionsTable_Castbar(UF.CreateAndUpdateUF, "target"),
|
||||||
--aurabar = GetOptionsTable_AuraBars(false, UF.CreateAndUpdateUF, "target"),
|
--aurabar = GetOptionsTable_AuraBars(false, UF.CreateAndUpdateUF, "target"),
|
||||||
raidicon = GetOptionsTable_RaidIcon(UF.CreateAndUpdateUF, "target"),
|
raidicon = GetOptionsTable_RaidIcon(UF.CreateAndUpdateUF, "target"),
|
||||||
GPSArrow = GetOptionsTableForNonGroup_GPS("target"),
|
GPSArrow = GetOptionsTableForNonGroup_GPS("target"),
|
||||||
@@ -3647,7 +3594,7 @@ E.Options.args.unitframe.args.pet = {
|
|||||||
portrait = GetOptionsTable_Portrait(UF.CreateAndUpdateUF, "pet"),
|
portrait = GetOptionsTable_Portrait(UF.CreateAndUpdateUF, "pet"),
|
||||||
--buffs = GetOptionsTable_Auras(true, "buffs", false, UF.CreateAndUpdateUF, "pet"),
|
--buffs = GetOptionsTable_Auras(true, "buffs", false, UF.CreateAndUpdateUF, "pet"),
|
||||||
--debuffs = GetOptionsTable_Auras(true, "debuffs", false, UF.CreateAndUpdateUF, "pet"),
|
--debuffs = GetOptionsTable_Auras(true, "debuffs", false, UF.CreateAndUpdateUF, "pet"),
|
||||||
castbar = GetOptionsTable_Castbar(false, UF.CreateAndUpdateUF, "pet"),
|
--castbar = GetOptionsTable_Castbar(UF.CreateAndUpdateUF, "pet"),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user