Mercurial > wow > hansgar_and_franzok_assist
changeset 58:0682d738499b v8.0.1.058
- 8.0.1 Update.
line wrap: on
line diff
--- a/Hansgar_And_Franzok_Assist.toc Sun Mar 11 10:50:42 2018 -0300 +++ b/Hansgar_And_Franzok_Assist.toc Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ -## Interface: 70300 +## Interface: 80000 ## Title: Hansgar And Franzok Assist ## Notes: Helps with Smart Stampers on Mythic during this encounter. ## SavedVariables: Hansgar_And_Franzok_DB
--- a/Libs/AceAddon-3.0/AceAddon-3.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceAddon-3.0/AceAddon-3.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> <Script file="AceAddon-3.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/AceComm-3.0/AceComm-3.0.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceComm-3.0/AceComm-3.0.lua Fri Jul 20 19:04:12 2018 -0300 @@ -9,7 +9,7 @@ -- make into AceComm. -- @class file -- @name AceComm-3.0 --- @release $Id: AceComm-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $ +-- @release $Id: AceComm-3.0.lua 1174 2018-05-14 17:29:49Z h.leppkes@gmail.com $ --[[ AceComm-3.0 @@ -20,7 +20,7 @@ local CallbackHandler = LibStub("CallbackHandler-1.0") local CTL = assert(ChatThrottleLib, "AceComm-3.0 requires ChatThrottleLib") -local MAJOR, MINOR = "AceComm-3.0", 10 +local MAJOR, MINOR = "AceComm-3.0", 12 local AceComm,oldminor = LibStub:NewLibrary(MAJOR, MINOR) if not AceComm then return end @@ -65,7 +65,11 @@ if #prefix > 16 then -- TODO: 15? error("AceComm:RegisterComm(prefix,method): prefix length is limited to 16 characters") end - RegisterAddonMessagePrefix(prefix) + if C_ChatInfo then + C_ChatInfo.RegisterAddonMessagePrefix(prefix) + else + RegisterAddonMessagePrefix(prefix) + end return AceComm._RegisterComm(self, prefix, method) -- created by CallbackHandler end @@ -85,7 +89,7 @@ if not( type(prefix)=="string" and type(text)=="string" and type(distribution)=="string" and - (target==nil or type(target)=="string") and + (target==nil or type(target)=="string" or type(target)=="number") and (prio=="BULK" or prio=="NORMAL" or prio=="ALERT") ) then error('Usage: SendCommMessage(addon, "prefix", "text", "distribution"[, "target"[, "prio"[, callbackFn, callbackarg]]])', 2)
--- a/Libs/AceComm-3.0/AceComm-3.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceComm-3.0/AceComm-3.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -2,4 +2,4 @@ ..\FrameXML\UI.xsd"> <Script file="ChatThrottleLib.lua"/> <Script file="AceComm-3.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/AceComm-3.0/ChatThrottleLib.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceComm-3.0/ChatThrottleLib.lua Fri Jul 20 19:04:12 2018 -0300 @@ -23,7 +23,7 @@ -- LICENSE: ChatThrottleLib is released into the Public Domain -- -local CTL_VERSION = 23 +local CTL_VERSION = 24 local _G = _G @@ -213,9 +213,15 @@ return ChatThrottleLib.Hook_SendChatMessage(...) end) --SendAddonMessage - hooksecurefunc("SendAddonMessage", function(...) - return ChatThrottleLib.Hook_SendAddonMessage(...) - end) + if _G.C_ChatInfo then + hooksecurefunc(_G.C_ChatInfo, "SendAddonMessage", function(...) + return ChatThrottleLib.Hook_SendAddonMessage(...) + end) + else + hooksecurefunc("SendAddonMessage", function(...) + return ChatThrottleLib.Hook_SendAddonMessage(...) + end) + end end self.nBypass = 0 end @@ -461,7 +467,7 @@ local nSize = text:len(); - if RegisterAddonMessagePrefix then + if C_ChatInfo or RegisterAddonMessagePrefix then if nSize>255 then error("ChatThrottleLib:SendAddonMessage(): message length cannot exceed 255 bytes", 2) end @@ -478,7 +484,11 @@ if not self.bQueueing and nSize < self:UpdateAvail() then self.avail = self.avail - nSize bMyTraffic = true - _G.SendAddonMessage(prefix, text, chattype, target) + if _G.C_ChatInfo then + _G.C_ChatInfo.SendAddonMessage(prefix, text, chattype, target) + else + _G.SendAddonMessage(prefix, text, chattype, target) + end bMyTraffic = false self.Prio[prio].nTotalSent = self.Prio[prio].nTotalSent + nSize if callbackFn then @@ -490,7 +500,7 @@ -- Message needs to be queued local msg = NewMsg() - msg.f = _G.SendAddonMessage + msg.f = _G.C_ChatInfo and _G.C_ChatInfo.SendAddonMessage or _G.SendAddonMessage msg[1] = prefix msg[2] = text msg[3] = chattype
--- a/Libs/AceConfig-3.0/AceConfig-3.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceConfig-3.0/AceConfig-3.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -5,4 +5,4 @@ <Include file="AceConfigDialog-3.0\AceConfigDialog-3.0.xml"/> <!--<Include file="AceConfigDropdown-3.0\AceConfigDropdown-3.0.xml"/>--> <Script file="AceConfig-3.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> <Script file="AceConfigCmd-3.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua Fri Jul 20 19:04:12 2018 -0300 @@ -1,13 +1,13 @@ --- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables. -- @class file -- @name AceConfigDialog-3.0 --- @release $Id: AceConfigDialog-3.0.lua 1167 2017-08-29 22:08:48Z funkydude $ +-- @release $Id: AceConfigDialog-3.0.lua 1169 2018-02-27 16:18:28Z nevcairiel $ local LibStub = LibStub local gui = LibStub("AceGUI-3.0") local reg = LibStub("AceConfigRegistry-3.0") -local MAJOR, MINOR = "AceConfigDialog-3.0", 64 +local MAJOR, MINOR = "AceConfigDialog-3.0", 66 local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR) if not AceConfigDialog then return end @@ -1034,6 +1034,7 @@ entry.value = k entry.text = GetOptionsMemberValue("name", v, options, path, appName) entry.icon = GetOptionsMemberValue("icon", v, options, path, appName) + entry.iconCoords = GetOptionsMemberValue("iconCoords", v, options, path, appName) entry.disabled = CheckOptionDisabled(v, options, path, appName) tinsert(tree,entry) if recurse and (v.childGroups or "tree") == "tree" then @@ -1226,6 +1227,8 @@ radio:SetWidth(width_multiplier * 2) elseif width == "half" then radio:SetWidth(width_multiplier / 2) + elseif (type(width) == "number") then + radio:SetWidth(width_multiplier * width) elseif width == "full" then radio.width = "fill" else @@ -1288,6 +1291,8 @@ control:SetWidth(width_multiplier * 2) elseif width == "half" then control:SetWidth(width_multiplier / 2) + elseif (type(width) == "number") then + control:SetWidth(width_multiplier * width) elseif width == "full" then control.width = "fill" else @@ -1324,6 +1329,8 @@ check:SetWidth(width_multiplier * 2) elseif width == "half" then check:SetWidth(width_multiplier / 2) + elseif (type(width) == "number") then + control:SetWidth(width_multiplier * width) elseif width == "full" then check.width = "fill" else @@ -1405,6 +1412,8 @@ control:SetWidth(width_multiplier * 2) elseif width == "half" then control:SetWidth(width_multiplier / 2) + elseif (type(width) == "number") then + control:SetWidth(width_multiplier * width) elseif width == "full" then control.width = "fill" else
--- a/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> <Script file="AceConfigDialog-3.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua Fri Jul 20 19:04:12 2018 -0300 @@ -8,10 +8,10 @@ -- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName". -- @class file -- @name AceConfigRegistry-3.0 --- @release $Id: AceConfigRegistry-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $ +-- @release $Id: AceConfigRegistry-3.0.lua 1169 2018-02-27 16:18:28Z nevcairiel $ local CallbackHandler = LibStub("CallbackHandler-1.0") -local MAJOR, MINOR = "AceConfigRegistry-3.0", 17 +local MAJOR, MINOR = "AceConfigRegistry-3.0", 18 local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR) if not AceConfigRegistry then return end @@ -67,6 +67,7 @@ local opttable={["nil"]=true,["table"]=true, _="table"} local optbool={["nil"]=true,["boolean"]=true, _="boolean"} local optboolnumber={["nil"]=true,["boolean"]=true,["number"]=true, _="boolean or number"} +local optstringnumber={["nil"]=true,["string"]=true,["number"]=true, _="string or number"} local basekeys={ type=isstring, @@ -90,7 +91,7 @@ set=optmethodfalse, func=optmethodfalse, arg={["*"]=true}, - width=optstring, + width=optstringnumber, } local typedkeys={
--- a/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> <Script file="AceConfigRegistry-3.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/AceConsole-3.0/AceConsole-3.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceConsole-3.0/AceConsole-3.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> <Script file="AceConsole-3.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/AceDB-3.0/AceDB-3.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceDB-3.0/AceDB-3.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> <Script file="AceDB-3.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/AceDBOptions-3.0/AceDBOptions-3.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceDBOptions-3.0/AceDBOptions-3.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> <Script file="AceDBOptions-3.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/AceEvent-3.0/AceEvent-3.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceEvent-3.0/AceEvent-3.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> <Script file="AceEvent-3.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/AceLocale-3.0/AceLocale-3.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceLocale-3.0/AceLocale-3.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> <Script file="AceLocale-3.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/AceTimer-3.0/AceTimer-3.0.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceTimer-3.0/AceTimer-3.0.lua Fri Jul 20 19:04:12 2018 -0300 @@ -15,7 +15,7 @@ -- make into AceTimer. -- @class file -- @name AceTimer-3.0 --- @release $Id: AceTimer-3.0.lua 1119 2014-10-14 17:23:29Z nevcairiel $ +-- @release $Id: AceTimer-3.0.lua 1170 2018-03-29 17:38:58Z funkydude $ local MAJOR, MINOR = "AceTimer-3.0", 17 -- Bump minor on changes local AceTimer, oldminor = LibStub:NewLibrary(MAJOR, MINOR) @@ -34,13 +34,15 @@ delay = 0.01 -- Restrict to the lowest time that the C_Timer API allows us end - local timer = {...} - timer.object = self - timer.func = func - timer.looping = loop - timer.argsCount = select("#", ...) - timer.delay = delay - timer.ends = GetTime() + delay + local timer = { + object = self, + func = func, + looping = loop, + argsCount = select("#", ...), + delay = delay, + ends = GetTime() + delay, + ... + } activeTimers[timer] = timer @@ -156,7 +158,7 @@ --- Cancels all timers registered to the current addon object ('self') function AceTimer:CancelAllTimers() - for k,v in pairs(activeTimers) do + for k,v in next, activeTimers do if v.object == self then AceTimer.CancelTimer(self, k) end @@ -187,8 +189,8 @@ AceTimer.frame:SetScript("OnEvent", nil) AceTimer.frame:UnregisterAllEvents() -- convert timers - for object,timers in pairs(AceTimer.selfs) do - for handle,timer in pairs(timers) do + for object,timers in next, AceTimer.selfs do + for handle,timer in next, timers do if type(timer) == "table" and timer.callback then local newTimer if timer.delay then @@ -214,7 +216,7 @@ -- Clear old timer table and update upvalue AceTimer.activeTimers = {} activeTimers = AceTimer.activeTimers - for handle, timer in pairs(oldTimers) do + for handle, timer in next, oldTimers do local newTimer -- Stop the old timer animation local duration, elapsed = timer:GetDuration(), timer:GetElapsed() @@ -232,7 +234,7 @@ -- Migrate transitional handles if oldminor < 13 and AceTimer.hashCompatTable then - for handle, id in pairs(AceTimer.hashCompatTable) do + for handle, id in next, AceTimer.hashCompatTable do local t = activeTimers[id] if t then activeTimers[id] = nil @@ -257,7 +259,7 @@ function AceTimer:Embed(target) AceTimer.embeds[target] = true - for _,v in pairs(mixins) do + for _,v in next, mixins do target[v] = AceTimer[v] end return target @@ -271,6 +273,6 @@ target:CancelAllTimers() end -for addon in pairs(AceTimer.embeds) do +for addon in next, AceTimer.embeds do AceTimer:Embed(addon) end
--- a/Libs/AceTimer-3.0/AceTimer-3.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/AceTimer-3.0/AceTimer-3.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> <Script file="AceTimer-3.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> <Script file="CallbackHandler-1.0.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/DF/addon.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/addon.lua Fri Jul 20 19:04:12 2018 -0300 @@ -59,4 +59,4 @@ return addon -end \ No newline at end of file +end
--- a/Libs/DF/auras.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/auras.lua Fri Jul 20 19:04:12 2018 -0300 @@ -10,6 +10,98 @@ local lower = string.lower local GetSpellBookItemInfo = GetSpellBookItemInfo +local CONST_MAX_SPELLS = 300000 + +function DF:GetAuraByName (unit, spellName, isDebuff) + isDebuff = isDebuff and "HARMFUL|PLAYER" + + for i = 1, 40 do + local name, texture, count, debuffType, duration, expirationTime, caster, canStealOrPurge, nameplateShowPersonal, spellId, canApplyAura, isBossDebuff, isCastByPlayer, nameplateShowAll = UnitAura (unit, i, isDebuff) + if (not name) then + return + end + + if (name == spellName) then + return name, texture, count, debuffType, duration, expirationTime, caster, canStealOrPurge, nameplateShowPersonal, spellId, canApplyAura, isBossDebuff, isCastByPlayer, nameplateShowAll + end + end +end + +local default_text_for_aura_frame = { + AUTOMATIC = "Automatic", + MANUAL = "Manual", + METHOD = "Aura Tracking Method:", + BUFFS_IGNORED = "Buffs Ignored", + DEBUFFS_IGNORED = "Debuffs Ignored", + BUFFS_TRACKED = "Buffs Tracked", + DEBUFFS_TRACKED = "Debuffs Tracked", + + AUTOMATIC_DESC = "Auras are being tracked automatically, the addon controls what to show.\nYou may add auras to the blacklist or add extra auras to track.", + MANUAL_DESC = "Auras are being tracked manually, the addon only check for auras you entered below.", + + MANUAL_ADD_BLACKLIST_BUFF = "Add Buff to Blacklist", + MANUAL_ADD_BLACKLIST_DEBUFF = "Add Debuff to Blacklist", + MANUAL_ADD_TRACKLIST_BUFF = "Add Buff to Tracklist", + MANUAL_ADD_TRACKLIST_DEBUFF = "Add Debuff to Tracklist", +} + +function DF:LoadAllSpells (hashMap, indexTable) + + --pre checking which tables to fill to avoid checking if the table exists during the gigantic loop for performance + + if (not DF.LoadingAuraAlertFrame) then + DF.LoadingAuraAlertFrame = CreateFrame ("frame", "DetailsFrameworkLoadingAurasAlert", UIParent) + DF.LoadingAuraAlertFrame:SetSize (340, 75) + DF.LoadingAuraAlertFrame:SetPoint ("center") + DF.LoadingAuraAlertFrame:SetFrameStrata ("TOOLTIP") + DF:ApplyStandardBackdrop (DF.LoadingAuraAlertFrame) + DF.LoadingAuraAlertFrame:SetBackdropBorderColor (1, 0.8, 0.1) + + DF.LoadingAuraAlertFrame.IsLoadingLabel1 = DF:CreateLabel (DF.LoadingAuraAlertFrame, "We are currently loading spell names and spell IDs") + DF.LoadingAuraAlertFrame.IsLoadingLabel2 = DF:CreateLabel (DF.LoadingAuraAlertFrame, "This may take only a few seconds") + DF.LoadingAuraAlertFrame.IsLoadingImage1 = DF:CreateImage (DF.LoadingAuraAlertFrame, [[Interface\DialogFrame\UI-Dialog-Icon-AlertOther]], 32, 32) + DF.LoadingAuraAlertFrame.IsLoadingLabel1.align = "center" + DF.LoadingAuraAlertFrame.IsLoadingLabel2.align = "center" + + DF.LoadingAuraAlertFrame.IsLoadingLabel1:SetPoint ("center", 16, 10) + DF.LoadingAuraAlertFrame.IsLoadingLabel2:SetPoint ("center", 16, -5) + DF.LoadingAuraAlertFrame.IsLoadingImage1:SetPoint ("left", 10, 0) + end + + DF.LoadingAuraAlertFrame:Show() + + C_Timer.After (0.1, function() + if (hashMap and not indexTable) then + for i = 1, CONST_MAX_SPELLS do + local spellName = GetSpellInfo (i) + if (spellName) then + hashMap [lower (spellName)] = i + end + end + + elseif (not hashMap and indexTable) then + for i = 1, CONST_MAX_SPELLS do + local spellName = GetSpellInfo (i) + if (spellName) then + indexTable [#indexTable+1] = lower (spellName) + end + end + + elseif (hashMap and indexTable) then + for i = 1, CONST_MAX_SPELLS do + local spellName = GetSpellInfo (i) + if (spellName) then + indexTable [#indexTable+1] = lower (spellName) + hashMap [indexTable [#indexTable]] = i + end + end + end + + DF.LoadingAuraAlertFrame:Hide() + end) + +end + local cleanfunction = function() end do @@ -32,10 +124,13 @@ --automatic self.buff_ignored:SetData (newdb.aura_tracker.buff_banned) self.debuff_ignored:SetData (newdb.aura_tracker.debuff_banned) - self.buff_available:Refresh() + self.buff_tracked:SetData (newdb.aura_tracker.buff_tracked) + self.debuff_tracked:SetData (newdb.aura_tracker.debuff_tracked) + self.buff_ignored:Refresh() - self.debuff_available:Refresh() self.debuff_ignored:Refresh() + self.buff_tracked:Refresh() + self.debuff_tracked:Refresh() --manual self.buffs_added:SetData (newdb.aura_tracker.buff) @@ -47,18 +142,29 @@ if (newdb.aura_tracker.track_method == 0x1) then self.f_auto:Show() self.f_manual:Hide() + + self.AutomaticTrackingCheckbox:SetValue (true) + self.ManualTrackingCheckbox:SetValue (false) + self.desc_label.text = texts.AUTOMATIC_DESC + elseif (newdb.aura_tracker.track_method == 0x2) then self.f_auto:Hide() self.f_manual:Show() + + self.AutomaticTrackingCheckbox:SetValue (false) + self.ManualTrackingCheckbox:SetValue (true) + self.desc_label.text = texts.MANUAL_DESC end end local aura_panel_defaultoptions = { height = 400, - row_height = 16, + row_height = 18, width = 230, + button_text_template = "OPTIONS_FONT_TEMPLATE" } -function DF:CreateAuraConfigPanel (parent, name, db, method_change_callback, options) + +function DF:CreateAuraConfigPanel (parent, name, db, change_callback, options, texts) local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE") local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE") @@ -81,155 +187,412 @@ f.f_auto = f_auto f.f_manual = f_manual - local on_select_tracking_option = function (_, _, method) + --check if the texts table is valid and also deploy default values into the table in case some value is nil + texts = (type (texts == "table") and texts) or default_text_for_aura_frame + DF.table.deploy (texts, default_text_for_aura_frame) + + ------------- + + local on_switch_tracking_method = function (self) + local method = self.Method + f.db.aura_tracker.track_method = method - if (method_change_callback) then - method_change_callback (self, method) + if (change_callback) then + DF:QuickDispatch (change_callback) end if (method == 0x1) then f_auto:Show() f_manual:Hide() - f.desc_label.text = "Auras are being tracked automatically, the addon controls what to show. You may entry an aura to ignore.\nCast spells to fill the Buff and Buff available boxes." - f.desc_label:SetPoint ("topleft", f.tracking_method, "topright", 10, 8) + f.AutomaticTrackingCheckbox:SetValue (true) + f.ManualTrackingCheckbox:SetValue (false) + f.desc_label.text = texts.AUTOMATIC_DESC + elseif (method == 0x2) then f_auto:Hide() f_manual:Show() - f.desc_label.text = "Auras are being tracked manually, the addon only check for auras you entered below." - f.desc_label:SetPoint ("topleft", f.tracking_method, "topright", 10, 1) + f.AutomaticTrackingCheckbox:SetValue (false) + f.ManualTrackingCheckbox:SetValue (true) + f.desc_label.text = texts.MANUAL_DESC end end - local tracking_options = function() - return { - {label = "Automatic", value = 0x1, onclick = on_select_tracking_option, desc = "Show all your auras by default, you can exclude those you don't want to show."}, - {label = "Manual", value = 0x2, onclick = on_select_tracking_option, desc = "Do not show any aura by default, you need to manually add each aura you want to track."}, - } + local background_method_selection = CreateFrame ("frame", nil, f) + background_method_selection:SetHeight (82) + background_method_selection:SetPoint ("topleft", f, "topleft", 0, 0) + background_method_selection:SetPoint ("topright", f, "topright", 0, 0) + DF:ApplyStandardBackdrop (background_method_selection) + + local tracking_method_label = self:CreateLabel (background_method_selection, texts.METHOD, 12, "orange") + tracking_method_label:SetPoint ("topleft", background_method_selection, "topleft", 6, -4) + + f.desc_label = self:CreateLabel (background_method_selection, "", 10, "silver") + f.desc_label:SetPoint ("left", background_method_selection, "left", 130, 0) + f.desc_label:SetJustifyV ("top") + + local automatic_tracking_checkbox = DF:CreateSwitch (background_method_selection, on_switch_tracking_method, f.db.aura_tracker.track_method == 0x1, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_BRIGHT_TEMPLATE")) + automatic_tracking_checkbox.Method = 0x1 + automatic_tracking_checkbox:SetAsCheckBox() + automatic_tracking_checkbox:SetSize (24, 24) + f.AutomaticTrackingCheckbox = automatic_tracking_checkbox + + local automatic_tracking_label = DF:CreateLabel (background_method_selection, "Automatic") + automatic_tracking_label:SetPoint ("left", automatic_tracking_checkbox, "right", 2, 0) + + local manual_tracking_checkbox = DF:CreateSwitch (background_method_selection, on_switch_tracking_method, f.db.aura_tracker.track_method == 0x2, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_BRIGHT_TEMPLATE")) + manual_tracking_checkbox.Method = 0x2 + manual_tracking_checkbox:SetAsCheckBox() + manual_tracking_checkbox:SetSize (24, 24) + f.ManualTrackingCheckbox = manual_tracking_checkbox + + local manual_tracking_label = DF:CreateLabel (background_method_selection, "Manual") + manual_tracking_label:SetPoint ("left", manual_tracking_checkbox, "right", 2, 0) + + automatic_tracking_checkbox:SetPoint ("topleft", tracking_method_label, "bottomleft", 0, -6) + manual_tracking_checkbox:SetPoint ("topleft", automatic_tracking_checkbox, "bottomleft", 0, -6) + + +-------- anchors points + + local y = -110 + local xLocation = 230 + + +-------- automatic + + --manual add the buff and ebuff names + local AllSpellsMap = {} + local AllSpellNames = {} + + local load_all_spells = function (self, capsule) + if (not next (AllSpellsMap)) then + DF:LoadAllSpells (AllSpellsMap, AllSpellNames) + + f_auto.AddBuffBlacklistTextBox.SpellAutoCompleteList = AllSpellNames + f_auto.AddDebuffBlacklistTextBox.SpellAutoCompleteList = AllSpellNames + f_auto.AddBuffTracklistTextBox.SpellAutoCompleteList = AllSpellNames + f_auto.AddDebuffTracklistTextBox.SpellAutoCompleteList = AllSpellNames + + f_manual.NewBuffTextBox.SpellAutoCompleteList = AllSpellNames + f_manual.NewDebuffTextBox.SpellAutoCompleteList = AllSpellNames + + -- + + f_auto.AddBuffBlacklistTextBox:SetAsAutoComplete ("SpellAutoCompleteList") + f_auto.AddDebuffBlacklistTextBox:SetAsAutoComplete ("SpellAutoCompleteList") + f_auto.AddBuffTracklistTextBox:SetAsAutoComplete ("SpellAutoCompleteList") + f_auto.AddDebuffTracklistTextBox:SetAsAutoComplete ("SpellAutoCompleteList") + + f_manual.NewBuffTextBox:SetAsAutoComplete ("SpellAutoCompleteList") + f_manual.NewDebuffTextBox:SetAsAutoComplete ("SpellAutoCompleteList") + + -- + + f_auto.AddBuffBlacklistTextBox.ShouldOptimizeAutoComplete = true + f_auto.AddDebuffBlacklistTextBox.ShouldOptimizeAutoComplete = true + f_auto.AddBuffTracklistTextBox.ShouldOptimizeAutoComplete = true + f_auto.AddDebuffTracklistTextBox.ShouldOptimizeAutoComplete = true + + f_manual.NewBuffTextBox.ShouldOptimizeAutoComplete = true + f_manual.NewDebuffTextBox.ShouldOptimizeAutoComplete = true + end end + + local background_add_blacklist = CreateFrame ("frame", nil, f_auto) + background_add_blacklist:SetSize (220, 135) + DF:ApplyStandardBackdrop (background_add_blacklist) - local tracking_method_label = self:CreateLabel (f, "Tracking Aura Method:", 12, "orange") - local tracking_method = self:CreateDropDown (f, tracking_options, f.db.aura_tracker.track_method, 120, 20, "dropdown_tracking_method", _, self:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")) + local background_add_tracklist = CreateFrame ("frame", nil, f_auto) + background_add_tracklist:SetSize (220, 135) + DF:ApplyStandardBackdrop (background_add_tracklist) - tracking_method_label:SetPoint ("topleft", f, "topleft", 10, -10) - tracking_method:SetPoint ("left", tracking_method_label, "right", 2, 0) - tracking_method:SetFrameStrata ("tooltip") - tracking_method.tooltip = "Choose which aura tracking method you want to use." - f.tracking_method = tracking_method + --black list + local buff_blacklist_label = self:CreateLabel (background_add_blacklist, texts.MANUAL_ADD_BLACKLIST_BUFF, DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) + local debuff_blacklist_label = self:CreateLabel (background_add_blacklist, texts.MANUAL_ADD_BLACKLIST_DEBUFF, DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) + + local buff_name_blacklist_entry = self:CreateTextEntry (background_add_blacklist, function()end, 200, 20, "AddBuffBlacklistTextBox", _, _, options_dropdown_template) + buff_name_blacklist_entry:SetHook ("OnEditFocusGained", load_all_spells) + buff_name_blacklist_entry:SetJustifyH ("left") + buff_name_blacklist_entry.tooltip = "Enter the buff name using lower case letters." + f_auto.AddBuffBlacklistTextBox = buff_name_blacklist_entry + + local debuff_name_blacklist_entry = self:CreateTextEntry (background_add_blacklist, function()end, 200, 20, "AddDebuffBlacklistTextBox", _, _, options_dropdown_template) + debuff_name_blacklist_entry:SetHook ("OnEditFocusGained", load_all_spells) + debuff_name_blacklist_entry:SetJustifyH ("left") + debuff_name_blacklist_entry.tooltip = "Enter the debuff name using lower case letters." + f_auto.AddDebuffBlacklistTextBox = debuff_name_blacklist_entry - f.desc_label = self:CreateLabel (f, "", 10, "silver") - f.desc_label:SetSize (400, 40) - f.desc_label:SetPoint ("topleft", tracking_method, "topright", 10, 8) - f.desc_label:SetJustifyV ("top") + local add_blacklist_buff_button = self:CreateButton (background_add_blacklist, function() + local text = buff_name_blacklist_entry.text + buff_name_blacklist_entry:SetText ("") + buff_name_blacklist_entry:ClearFocus() + + if (text ~= "") then + text = lower (text) + + --get the spellId + local spellId = AllSpellsMap [text] + if (not spellId) then + print ("spell not found") + return + end + + --add the spellId to the blacklist + f.db.aura_tracker.buff_banned [spellId] = true + + --refresh the buff blacklist frame + _G [f_auto:GetName() .. "BuffIgnored"]:Refresh() + + DF:QuickDispatch (change_callback) + end + + end, 100, 20, "Add to Blacklist", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), DF:GetTemplate ("font", options.button_text_template)) + + local add_blacklist_debuff_button = self:CreateButton (background_add_blacklist, function() + local text = debuff_name_blacklist_entry.text + debuff_name_blacklist_entry:SetText ("") + debuff_name_blacklist_entry:ClearFocus() + + if (text ~= "") then + text = lower (text) + + --get the spellId + local spellId = AllSpellsMap [text] + if (not spellId) then + print ("spell not found") + return + end + + --add the spellId to the blacklist + f.db.aura_tracker.debuff_banned [spellId] = true + + --refresh the buff blacklist frame + _G [f_auto:GetName() .. "DebuffIgnored"]:Refresh() + + DF:QuickDispatch (change_callback) + end + end, 100, 20, "Add to Blacklist", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), DF:GetTemplate ("font", options.button_text_template)) + + + --track list + local buff_tracklist_label = self:CreateLabel (background_add_tracklist, texts.MANUAL_ADD_TRACKLIST_BUFF, DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) + local debuff_tracklist_label = self:CreateLabel (background_add_tracklist, texts.MANUAL_ADD_TRACKLIST_DEBUFF, DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) + + local buff_name_tracklist_entry = self:CreateTextEntry (background_add_tracklist, function()end, 200, 20, "AddBuffTracklistTextBox", _, _, options_dropdown_template) + buff_name_tracklist_entry:SetHook ("OnEditFocusGained", load_all_spells) + buff_name_tracklist_entry:SetJustifyH ("left") + buff_name_tracklist_entry.tooltip = "Enter the buff name using lower case letters." + f_auto.AddBuffTracklistTextBox = buff_name_tracklist_entry + + local debuff_name_tracklist_entry = self:CreateTextEntry (background_add_tracklist, function()end, 200, 20, "AddDebuffTracklistTextBox", _, _, options_dropdown_template) + debuff_name_tracklist_entry:SetHook ("OnEditFocusGained", load_all_spells) + debuff_name_tracklist_entry:SetJustifyH ("left") + debuff_name_tracklist_entry.tooltip = "Enter the debuff name using lower case letters." + f_auto.AddDebuffTracklistTextBox = debuff_name_tracklist_entry + + local add_tracklist_buff_button = self:CreateButton (background_add_tracklist, function() + local text = buff_name_tracklist_entry.text + buff_name_tracklist_entry:SetText ("") + buff_name_tracklist_entry:ClearFocus() + + if (text ~= "") then + text = lower (text) + + --get the spellId + local spellId = AllSpellsMap [text] + if (not spellId) then + print ("spell not found") + return + end + + --add the spellId to the blacklist + f.db.aura_tracker.buff_tracked [spellId] = true + + --refresh the buff blacklist frame + _G [f_auto:GetName() .. "BuffTracked"]:Refresh() + + DF:QuickDispatch (change_callback) + end + + end, 100, 20, "Add to Tracklist", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), DF:GetTemplate ("font", options.button_text_template)) + + local add_tracklist_debuff_button = self:CreateButton (background_add_tracklist, function() + local text = debuff_name_tracklist_entry.text + debuff_name_tracklist_entry:SetText ("") + debuff_name_tracklist_entry:ClearFocus() + + if (text ~= "") then + text = lower (text) + + --get the spellId + local spellId = AllSpellsMap [text] + if (not spellId) then + print ("spell not found") + return + end + + --add the spellId to the blacklist + f.db.aura_tracker.debuff_tracked [spellId] = true + + --refresh the buff blacklist frame + _G [f_auto:GetName() .. "DebuffTracked"]:Refresh() + + DF:QuickDispatch (change_callback) + end + end, 100, 20, "Add to Tracklist", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), DF:GetTemplate ("font", options.button_text_template)) + + --anchors: + background_add_blacklist:SetPoint ("topleft", f_auto, "topleft", 0, y) + background_add_tracklist:SetPoint ("topleft", background_add_blacklist, "bottomleft", 0, -10) + + --debuff blacklist + debuff_name_blacklist_entry:SetPoint ("topleft", background_add_blacklist, "topleft", 4, -20) + debuff_blacklist_label:SetPoint ("bottomleft", debuff_name_blacklist_entry, "topleft", 0, 2) + add_blacklist_debuff_button:SetPoint ("topleft", debuff_name_blacklist_entry, "bottomleft", 0, -2) + + --buff blacklist + buff_blacklist_label:SetPoint ("topleft", add_blacklist_debuff_button.widget, "bottomleft", 0, -10) + buff_name_blacklist_entry:SetPoint ("topleft", buff_blacklist_label, "bottomleft", 0, -2) + add_blacklist_buff_button:SetPoint ("topleft", buff_name_blacklist_entry, "bottomleft", 0, -2) ---------automatic + + --debuff tracklist + debuff_name_tracklist_entry:SetPoint ("topleft", background_add_tracklist, "topleft", 4, -20) + debuff_tracklist_label:SetPoint ("bottomleft", debuff_name_tracklist_entry, "topleft", 0, 2) + add_tracklist_debuff_button:SetPoint ("topleft", debuff_name_tracklist_entry, "bottomleft", 0, -2) + + --buff tracklist + buff_tracklist_label:SetPoint ("topleft", add_tracklist_debuff_button.widget, "bottomleft", 0, -10) + buff_name_tracklist_entry:SetPoint ("topleft", buff_tracklist_label, "bottomleft", 0, -2) + add_tracklist_buff_button:SetPoint ("topleft", buff_name_tracklist_entry, "bottomleft", 0, -2) local ALL_BUFFS = {} local ALL_DEBUFFS = {} + --options passed to the create aura panel local width, height, row_height = options.width, options.height, options.row_height + - local buff_ignored = self:CreateSimpleListBox (f_auto, "$parentBuffIgnored", "Buffs Ignored", "The list is empty, select a spell from the buff list to ignore it.", f.db.aura_tracker.buff_banned, - function (spellid) - f.db.aura_tracker.buff_banned [spellid] = nil; - end, - { - icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, - text = function(spellid) return select (1, GetSpellInfo (spellid)) end, - height = height, - row_height = row_height, - width = width, - onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:AddLine ("Click to un-ignore this aura", .2, 1, .2); GameTooltip:Show() end, - }) + --Debuffs on the black list + local debuff_ignored = self:CreateSimpleListBox (f_auto, "$parentDebuffIgnored", texts.DEBUFFS_IGNORED, "the list is empty", f.db.aura_tracker.debuff_banned, function (spellid) + --f.db.aura_tracker.debuff_banned [spellid] = nil; DF:QuickDispatch (change_callback); + end, + { + icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, + text = function(spellid) return select (1, GetSpellInfo (spellid)) end, + height = height, + row_height = row_height, + width = width, + backdrop_color = {.8, .8, .8, 0.2}, + panel_border_color = {.01, 0, 0, 1}, + iconcoords = {.1, .9, .1, .9}, + onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:Show() end, + show_x_button = true, + x_button_func = function (spellId) + f.db.aura_tracker.debuff_banned [spellId] = nil; DF:QuickDispatch (change_callback); + end, + }) - local buff_available = self:CreateSimpleListBox (f_auto, "$parentBuffAvailable", "Buffs Available", "The list is empty, cast spells to fill it", ALL_BUFFS, function (spellid) - f.db.aura_tracker.buff_banned [spellid] = true; buff_ignored:Refresh() - end, - { - icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, - text = function(spellid) return select (1, GetSpellInfo (spellid)) end, - height = height, - row_height = row_height, - width = width, - onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:AddLine ("Click to ignore this aura", .2, 1, .2); GameTooltip:Show() end, - }) - - local debuff_ignored = self:CreateSimpleListBox (f_auto, "$parentDebuffIgnored", "Debuffs Ignored", "The list is empty, select a spell from the debuff list to ignore it.", f.db.aura_tracker.debuff_banned, function (spellid) - f.db.aura_tracker.debuff_banned [spellid] = nil; - end, - { - icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, - text = function(spellid) return select (1, GetSpellInfo (spellid)) end, - height = height, - row_height = row_height, - width = width, - onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:AddLine ("Click to un-ignore this aura", .2, 1, .2); GameTooltip:Show() end, - }) - - local debuff_available = self:CreateSimpleListBox (f_auto, "$parentDebuffAvailable", "Debuffs Available", "The list is empty, cast spells to fill it", ALL_DEBUFFS, function (spellid) - f.db.aura_tracker.debuff_banned [spellid] = true; debuff_ignored:Refresh() - end, { - icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, - text = function(spellid) return select (1, GetSpellInfo (spellid)) end, - height = height, - row_height = row_height, - width = width, - onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:AddLine ("Click to ignore this aura", .2, 1, .2); GameTooltip:Show() end, - }) - - --como ira preencher ela no inicio e como ficara o lance dos profiles + --Buffs on the black list + local buff_ignored = self:CreateSimpleListBox (f_auto, "$parentBuffIgnored", texts.BUFFS_IGNORED, "the list is empty", f.db.aura_tracker.buff_banned, + function (spellid) + --f.db.aura_tracker.buff_banned [spellid] = nil; DF:QuickDispatch (change_callback); + end, + { + icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, + text = function(spellid) return select (1, GetSpellInfo (spellid)) end, + height = height, + row_height = row_height, + width = width, + backdrop_color = {.8, .8, .8, 0.2}, + panel_border_color = {.02, 0, 0, 1}, + iconcoords = {.1, .9, .1, .9}, + onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:Show() end, + show_x_button = true, + x_button_func = function (spellId) + f.db.aura_tracker.buff_banned [spellId] = nil; DF:QuickDispatch (change_callback); + end, + }) - local y = -40 - buff_available:SetPoint ("topleft", f_auto, "topleft", 0, y) - buff_ignored:SetPoint ("topleft", f_auto, "topleft", 6 + width, y) - debuff_available:SetPoint ("topleft", f_auto, "topleft", 12 + (width*2), y) - debuff_ignored:SetPoint ("topleft", f_auto, "topleft", 18 + (width*3), y) - - f.buff_available = buff_available + --Debuffs on the track list + local debuff_tracked = self:CreateSimpleListBox (f_auto, "$parentDebuffTracked", texts.DEBUFFS_TRACKED, "the list is empty", f.db.aura_tracker.debuff_tracked, function (spellid) + --f.db.aura_tracker.debuff_tracked [spellid] = nil; DF:QuickDispatch (change_callback); + end, + { + icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, + text = function(spellid) return select (1, GetSpellInfo (spellid)) end, + height = height, + row_height = row_height, + width = width, + backdrop_color = {.8, .8, .8, 0.2}, + panel_border_color = {0, .02, 0, 1}, + iconcoords = {.1, .9, .1, .9}, + onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:Show() end, + show_x_button = true, + x_button_func = function (spellId) + f.db.aura_tracker.debuff_tracked [spellId] = nil; DF:QuickDispatch (change_callback); + end, + }) + + --Buffs on the track list + local buff_tracked = self:CreateSimpleListBox (f_auto, "$parentBuffTracked", texts.BUFFS_TRACKED, "the list is empty", f.db.aura_tracker.buff_tracked, function (spellid) + --f.db.aura_tracker.buff_tracked [spellid] = nil; DF:QuickDispatch (change_callback); + end, + { + icon = function(spellid) return select (3, GetSpellInfo (spellid)) end, + text = function(spellid) return select (1, GetSpellInfo (spellid)) end, + height = height, + row_height = row_height, + width = width, + backdrop_color = {.8, .8, .8, 0.2}, + panel_border_color = {0, .01, 0, 1}, + iconcoords = {.1, .9, .1, .9}, + onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:Show() end, + show_x_button = true, + x_button_func = function (spellId) + f.db.aura_tracker.buff_tracked [spellId] = nil; DF:QuickDispatch (change_callback); + end, + }) + + debuff_ignored:SetPoint ("topleft", f_auto, "topleft", 0 + xLocation, y) + buff_ignored:SetPoint ("topleft", f_auto, "topleft", 8 + width + xLocation, y) + debuff_tracked:SetPoint ("topleft", f_auto, "topleft", 16 + (width*2) + xLocation, y) + buff_tracked:SetPoint ("topleft", f_auto, "topleft", 24 + (width*3) + xLocation, y) + f.buff_ignored = buff_ignored - f.debuff_available = debuff_available f.debuff_ignored = debuff_ignored + f.buff_tracked = buff_tracked + f.debuff_tracked = debuff_tracked - local readCombatLog = CreateFrame ("frame", nil, f_auto) - readCombatLog:SetScript ("OnEvent", function (self, event, time, token, hidding, sourceGUID, sourceName, sourceFlag, sourceFlag2, targetGUID, targetName, targetFlag, targetFlag2, spellid, spellname, spellschool, auraType, amount) - if (auraType == "BUFF" and sourceGUID == readCombatLog.playerGUID) then - if (not ALL_BUFFS [spellid]) then - ALL_BUFFS [spellid] = true - buff_available:Refresh() - end - elseif (auraType == "DEBUFF" and sourceGUID == readCombatLog.playerGUID) then - if (not ALL_DEBUFFS [spellid]) then - ALL_DEBUFFS [spellid] = true - debuff_available:Refresh() - end - end - end) - f_auto:SetScript ("OnShow", function() for i = 1, BUFF_MAX_DISPLAY do - local name, rank, texture, count, debuffType, duration, expirationTime, caster, _, nameplateShowPersonal, spellId, _, _, _, nameplateShowAll = UnitAura ("player", i, "HELPFUL") + local name, texture, count, debuffType, duration, expirationTime, caster, _, nameplateShowPersonal, spellId, _, _, _, nameplateShowAll = UnitAura ("player", i, "HELPFUL") if (name) then ALL_BUFFS [spellId] = true end - local name, rank, texture, count, debuffType, duration, expirationTime, caster, _, nameplateShowPersonal, spellId, _, _, _, nameplateShowAll = UnitAura ("player", i, "HARMFUL") + local name, texture, count, debuffType, duration, expirationTime, caster, _, nameplateShowPersonal, spellId, _, _, _, nameplateShowAll = UnitAura ("player", i, "HARMFUL") if (name) then ALL_DEBUFFS [spellId] = true end end - buff_available:Refresh() - buff_ignored:Refresh() - debuff_available:Refresh() + buff_tracked:Refresh() + debuff_tracked:Refresh() + buff_ignored:Refresh() debuff_ignored:Refresh() - readCombatLog.playerGUID = UnitGUID ("player") - readCombatLog:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED") end) f_auto:SetScript ("OnHide", function() - readCombatLog:UnregisterEvent ("COMBAT_LOG_EVENT_UNFILTERED") + -- end) - + --show the frame selecton on the f.db - on_select_tracking_option (_, _, f.db.aura_tracker.track_method) + + if (f.db.aura_tracker.track_method == 0x1) then + on_switch_tracking_method (automatic_tracking_checkbox) + elseif (f.db.aura_tracker.track_method == 0x2) then + on_switch_tracking_method (manual_tracking_checkbox) + end -------manual @@ -250,7 +613,6 @@ GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID (spellid) GameTooltip:AddLine (" ") - GameTooltip:AddLine ("Click to untrack this aura", .2, 1, .2) GameTooltip:Show() end end @@ -259,9 +621,10 @@ self:SetBackdropColor (unpack (backdrop_color)) GameTooltip:Hide() end - local line_onclick = function (self) - local spell = self.value - local data = self:GetParent():GetData() + + local onclick_remove_button = function (self) + local spell = self:GetParent().value + local data = self:GetParent():GetParent():GetData() for i = 1, #data do if (data[i] == spell) then @@ -270,27 +633,36 @@ end end - self:GetParent():Refresh() + self:GetParent():GetParent():Refresh() end local scroll_createline = function (self, index) local line = CreateFrame ("button", "$parentLine" .. index, self) - line:SetPoint ("topleft", self, "topleft", 0, -((index-1)*(scroll_line_height+1))) - line:SetSize (scroll_width, scroll_line_height) + line:SetPoint ("topleft", self, "topleft", 1, -((index-1)*(scroll_line_height+1)) - 1) + line:SetSize (scroll_width - 2, scroll_line_height) line:SetScript ("OnEnter", line_onenter) line:SetScript ("OnLeave", line_onleave) - line:SetScript ("OnClick", line_onclick) line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) line:SetBackdropColor (unpack (backdrop_color)) local icon = line:CreateTexture ("$parentIcon", "overlay") - icon:SetSize (scroll_line_height, scroll_line_height) + icon:SetSize (scroll_line_height - 2, scroll_line_height - 2) + local name = line:CreateFontString ("$parentName", "overlay", "GameFontNormal") + + local remove_button = CreateFrame ("button", "$parentRemoveButton", line, "UIPanelCloseButton") + remove_button:SetSize (16, 16) + remove_button:SetScript ("OnClick", onclick_remove_button) + remove_button:SetPoint ("topright", line, "topright") + remove_button:GetNormalTexture():SetDesaturated (true) + icon:SetPoint ("left", line, "left", 2, 0) name:SetPoint ("left", icon, "right", 2, 0) + line.icon = icon line.name = name + line.removebutton = remove_button return line end @@ -306,6 +678,7 @@ if (name) then line.name:SetText (name) line.icon:SetTexture (icon) + line.icon:SetTexCoord (.1, .9, .1, .9) else line.name:SetText (aura) line.icon:SetTexture ([[Interface\InventoryItems\WoWUnknownItem01]]) @@ -316,18 +689,16 @@ local buffs_added = self:CreateScrollBox (f_manual, "$parentBuffsAdded", scroll_refresh, f.db.aura_tracker.buff, scroll_width, scroll_height, scroll_lines, scroll_line_height) buffs_added:SetPoint ("topleft", f_manual, "topleft", 0, y) - buffs_added:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) - buffs_added:SetBackdropColor (0, 0, 0, 0.2) - buffs_added:SetBackdropBorderColor (0, 0, 0, 1) + DF:ReskinSlider (buffs_added) + for i = 1, scroll_lines do buffs_added:CreateLine (scroll_createline) end local debuffs_added = self:CreateScrollBox (f_manual, "$parentDebuffsAdded", scroll_refresh, f.db.aura_tracker.debuff, scroll_width, scroll_height, scroll_lines, scroll_line_height) debuffs_added:SetPoint ("topleft", f_manual, "topleft", width+30, y) - debuffs_added:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) - debuffs_added:SetBackdropColor (0, 0, 0, 0.2) - debuffs_added:SetBackdropBorderColor (0, 0, 0, 1) + DF:ReskinSlider (debuffs_added) + for i = 1, scroll_lines do debuffs_added:CreateLine (scroll_createline) end @@ -339,6 +710,7 @@ buffs_added_name:SetTemplate (DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) buffs_added_name:SetPoint ("bottomleft", buffs_added, "topleft", 0, 2) buffs_added.Title = buffs_added_name + local debuffs_added_name = DF:CreateLabel (debuffs_added, "Debuffs", 12, "silver") debuffs_added_name:SetTemplate (DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) debuffs_added_name:SetPoint ("bottomleft", debuffs_added, "topleft", 0, 2) @@ -347,36 +719,55 @@ --> build the text entry to type the spellname local new_buff_string = self:CreateLabel (f_manual, "Add Buff") local new_debuff_string = self:CreateLabel (f_manual, "Add Debuff") - local new_buff_entry = self:CreateTextEntry (f_manual, function()end, 200, 20, "NewBuffTextBox", _, _, options_dropdown_template) local new_debuff_entry = self:CreateTextEntry (f_manual, function()end, 200, 20, "NewDebuffTextBox", _, _, options_dropdown_template) + new_buff_entry:SetHook ("OnEditFocusGained", load_all_spells) + new_debuff_entry:SetHook ("OnEditFocusGained", load_all_spells) + new_buff_entry.tooltip = "Enter the buff name using lower case letters.\n\nYou can add several spells at once using |cFFFFFF00;|r to separate each spell name." + new_debuff_entry.tooltip = "Enter the debuff name using lower case letters.\n\nYou can add several spells at once using |cFFFFFF00;|r to separate each spell name." + new_buff_entry:SetJustifyH ("left") new_debuff_entry:SetJustifyH ("left") - DF:SetAutoCompleteWithSpells (new_buff_entry) - DF:SetAutoCompleteWithSpells (new_debuff_entry) + local add_buff_button = self:CreateButton (f_manual, function() - local add_buff_button = self:CreateButton (f_manual, function() local text = new_buff_entry.text new_buff_entry:SetText ("") new_buff_entry:ClearFocus() + if (text ~= "") then --> check for more than one spellname if (text:find (";")) then - for _, spellname in ipairs ({strsplit (";", text)}) do - spellname = self:trim (spellname) - if (string.len (spellname) > 0) then - tinsert (f.db.aura_tracker.buff, spellname) + for _, spellName in ipairs ({strsplit (";", text)}) do + spellName = self:trim (spellName) + spellName = lower (spellName) + if (string.len (spellName) > 0) then + local spellId = AllSpellsMap [spellName] + if (spellId) then + tinsert (f.db.aura_tracker.buff, spellId) + else + print ("spellId not found for spell:", spellName) + end end end else - tinsert (f.db.aura_tracker.buff, text) + --get the spellId + local spellName = lower (text) + local spellId = AllSpellsMap [spellName] + if (not spellId) then + print ("spellIs for spell ", spellName, "not found") + return + end + + tinsert (f.db.aura_tracker.buff, spellId) end buffs_added:Refresh() end + end, 100, 20, "Add Buff", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")) + local add_debuff_button = self:CreateButton (f_manual, function() local text = new_debuff_entry.text new_debuff_entry:SetText ("") @@ -384,29 +775,47 @@ if (text ~= "") then --> check for more than one spellname if (text:find (";")) then - for _, spellname in ipairs ({strsplit (";", text)}) do - spellname = self:trim (spellname) - if (string.len (spellname) > 0) then - tinsert (f.db.aura_tracker.debuff, spellname) + for _, spellName in ipairs ({strsplit (";", text)}) do + spellName = self:trim (spellName) + spellName = lower (spellName) + if (string.len (spellName) > 0) then + local spellId = AllSpellsMap [spellName] + if (spellId) then + tinsert (f.db.aura_tracker.debuff, spellId) + else + print ("spellId not found for spell:", spellName) + end end end else - tinsert (f.db.aura_tracker.debuff, text) + --get the spellId + local spellName = lower (text) + local spellId = AllSpellsMap [spellName] + if (not spellId) then + print ("spellIs for spell ", spellName, "not found") + return + end + + tinsert (f.db.aura_tracker.debuff, spellId) end + debuffs_added:Refresh() end end, 100, 20, "Add Debuff", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")) local multiple_spells_label = DF:CreateLabel (buffs_added, "You can add multiple auras at once by separating them with ';'.\nExample: Fireball; Frostbolt; Flamestrike", 10, "gray") - multiple_spells_label:SetSize (350, 60) + multiple_spells_label:SetSize (350, 24) multiple_spells_label:SetJustifyV ("top") local export_box = self:CreateTextEntry (f_manual, function()end, 242, 20, "ExportAuraTextBox", _, _, options_dropdown_template) local export_buff_button = self:CreateButton (f_manual, function() local str = "" - for _, spellname in ipairs (f.db.aura_tracker.buff) do - str = str .. spellname .. "; " + for _, spellId in ipairs (f.db.aura_tracker.buff) do + local spellName = GetSpellInfo (spellId) + if (spellName) then + str = str .. spellName .. "; " + end end export_box.text = str export_box:SetFocus (true) @@ -416,30 +825,34 @@ local export_debuff_button = self:CreateButton (f_manual, function() local str = "" - for _, spellname in ipairs (f.db.aura_tracker.debuff) do - str = str .. spellname .. "; " + for _, spellId in ipairs (f.db.aura_tracker.debuff) do + local spellName = GetSpellInfo (spellId) + if (spellName) then + str = str .. spellName .. "; " + end end + export_box.text = str export_box:SetFocus (true) export_box:HighlightText() end, 120, 20, "Export Debuffs", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")) - multiple_spells_label:SetPoint ("topleft", f_manual, "topleft", 480, -120) - - export_buff_button:SetPoint ("topleft", f_manual, "topleft", 480, -160) - export_debuff_button:SetPoint ("left",export_buff_button, "right", 2, 0) - export_box:SetPoint ("topleft", f_manual, "topleft", 480, -185) - - new_buff_string:SetPoint ("topleft", f_manual, "topleft", 480, -40) - new_buff_entry:SetPoint ("topleft", new_buff_string, "bottomleft", 0, -2) + new_buff_entry:SetPoint ("topleft", f_manual, "topleft", 480, y) + new_buff_string:SetPoint ("bottomleft", new_buff_entry, "topleft", 0, 2) add_buff_button:SetPoint ("left", new_buff_entry, "right", 2, 0) add_buff_button.tooltip = "Add the aura to be tracked.\n\nClick an aura on the list to remove it." - new_debuff_string:SetPoint ("topleft", f_manual, "topleft", 480, -80) + new_debuff_string:SetPoint ("topleft", new_buff_entry, "bottomleft", 0, -6) new_debuff_entry:SetPoint ("topleft", new_debuff_string, "bottomleft", 0, -2) add_debuff_button:SetPoint ("left", new_debuff_entry, "right", 2, 0) add_debuff_button.tooltip = "Add the aura to be tracked.\n\nClick an aura on the list to remove it." + + multiple_spells_label:SetPoint ("topleft", new_debuff_entry, "bottomleft", 0, -6) + + export_buff_button:SetPoint ("topleft", multiple_spells_label, "bottomleft", 0, -12) + export_debuff_button:SetPoint ("left",export_buff_button, "right", 2, 0) + export_box:SetPoint ("topleft", export_buff_button, "bottomleft", 0, -6) buffs_added:Refresh() debuffs_added:Refresh()
--- a/Libs/DF/button.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/button.lua Fri Jul 20 19:04:12 2018 -0300 @@ -404,6 +404,12 @@ end -- icon + function ButtonMetaFunctions:GetIconTexture() + if (self.icon) then + return self.icon:GetTexture() + end + end + function ButtonMetaFunctions:SetIcon (texture, width, height, layout, texcoord, overlay, textdistance, leftpadding, textheight, short_method) if (not self.icon) then self.icon = self:CreateTexture (nil, "artwork") @@ -1170,4 +1176,4 @@ return button -end \ No newline at end of file +end
--- a/Libs/DF/button.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/button.xml Fri Jul 20 19:04:12 2018 -0300 @@ -39,4 +39,4 @@ </Scripts> </Button> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/DF/colors.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/colors.lua Fri Jul 20 19:04:12 2018 -0300 @@ -164,4 +164,4 @@ ["yellow"] = {1, 1, 0, 1}, ["yellowgreen"] = {0.603922, 0.803922, 0.196078, 1} } -end \ No newline at end of file +end
--- a/Libs/DF/cooltip.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/cooltip.lua Fri Jul 20 19:04:12 2018 -0300 @@ -121,6 +121,14 @@ ["SelectedRightAnchorMod"] = true, } + CoolTip.AliasList = { + ["VerticalOffset"] = "ButtonsYMod", + ["VerticalPadding"] = "YSpacingMod", + ["LineHeightSizeOffset"] = "ButtonHeightMod", + ["FrameHeightSizeOffset"] = "HeighMod", + + } + CoolTip.OptionsTable = {} --cprops @@ -1824,14 +1832,18 @@ CoolTip:SetOption ("HeightAnchorMod", 0) end - function CoolTip:SetOption (option, value) + function CoolTip:SetOption (optionName, value) + + --> check for name alias + optionName = CoolTip.AliasList [optionName] or optionName + --> check if this options exists - if (not CoolTip.OptionsList [option]) then + if (not CoolTip.OptionsList [optionName]) then return --> error end - + --> set options - CoolTip.OptionsTable [option] = value + CoolTip.OptionsTable [optionName] = value end ---------------------------------------------------------------------- @@ -3131,4 +3143,4 @@ end -DF:CreateCoolTip() \ No newline at end of file +DF:CreateCoolTip()
--- a/Libs/DF/cooltip.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/cooltip.xml Fri Jul 20 19:04:12 2018 -0300 @@ -101,7 +101,7 @@ </Texture> <!-- banner image --> - <Texture name="$parent_UpperImage2" hidden="true" parentKey="upperImage2" file = ""> + <Texture name="$parent_UpperImage2" hidden="true" parentKey="upperImage2"> <Anchors> <Anchor point="CENTER" relativeTo="$parent" relativePoint="CENTER" x="0" y="-3"/> <Anchor point="BOTTOM" relativeTo="$parent" relativePoint="TOP" x="0" y="-3"/> @@ -111,7 +111,7 @@ <Layer level="OVERLAY"> <!-- upper image2 --> - <Texture name="$parent_UpperImage" hidden="true" parentKey="upperImage" file = ""> + <Texture name="$parent_UpperImage" hidden="true" parentKey="upperImage"> <Anchors> <Anchor point="CENTER" relativeTo="$parent" relativePoint="CENTER" x="0" y="-3"/> <Anchor point="BOTTOM" relativeTo="$parent" relativePoint="TOP" x="0" y="-3"/> @@ -315,4 +315,4 @@ <Script file="cooltip.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/DF/dropdown.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/dropdown.lua Fri Jul 20 19:04:12 2018 -0300 @@ -537,6 +537,10 @@ GameCooltip2:SetOption ("TextFont", frame.table.descfont) end + if (frame.table.tooltipwidth) then + GameCooltip2:SetOption ("FixedWidth", frame.table.tooltipwidth) + end + GameCooltip2:SetHost (frame, "topleft", "topright", 10, 0) GameCooltip2:ShowCooltip (nil, "tooltip")
--- a/Libs/DF/fw.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/fw.lua Fri Jul 20 19:04:12 2018 -0300 @@ -1,5 +1,5 @@ -local dversion = 68 +local dversion = 85 local major, minor = "DetailsFramework-1.0", dversion local DF, oldminor = LibStub:NewLibrary (major, minor) @@ -15,6 +15,10 @@ local _type = type local _unpack = unpack local upper = string.upper +local string_match = string.match + +SMALL_NUMBER = 0.000001 +ALPHA_BLEND_AMOUNT = 0.8400251 --> will always give a very random name for our widgets local init_counter = math.random (1, 1000000) @@ -117,6 +121,12 @@ "CreateBorder", "FormatNumber", "IntegerToTimer", + "QuickDispatch", + "CommaValue", + "RemoveRealmName", + "Trim", + "CreateGlowOverlay", + "CreateFrameShake", } DF.table = {} @@ -181,6 +191,7 @@ t1 [key] = value end end + return t1 end function DF.table.dump (t, s, deep) @@ -258,6 +269,22 @@ end end +function DF:CommaValue (value) + if (not value) then + return "0" + end + + value = floor (value) + + if (value == 0) then + return "0" + end + + --source http://richard.warburton.it + local left, num, right = string_match (value, '^([^%d]*%d)(%d*)(.-)$') + return left .. (num:reverse():gsub ('(%d%d%d)','%1,'):reverse()) .. right +end + function DF:IntegerToTimer (value) return "" .. floor (value/60) .. ":" .. format ("%02.f", value%60) end @@ -328,13 +355,17 @@ fontString:SetFont (fonte, size, outline) end +function DF:Trim (s) --hello name conventions! + return DF:trim (s) +end + function DF:trim (s) local from = s:match"^%s*()" return from > #s and "" or s:match(".*%S", from) end function DF:Msg (msg) - print ("|cFFFFFFAA" .. self.__name .. "|r " .. msg) + print ("|cFFFFFFAA" .. (self.__name or "FW Msg:") .. "|r ", msg) end function DF:GetNpcIdFromGuid (guid) @@ -345,6 +376,25 @@ return 0 end +function DF.SortOrder1 (t1, t2) + return t1[1] > t2[1] +end +function DF.SortOrder2 (t1, t2) + return t1[2] > t2[2] +end +function DF.SortOrder3 (t1, t2) + return t1[3] > t2[3] +end +function DF.SortOrder1R (t1, t2) + return t1[1] < t2[1] +end +function DF.SortOrder2R (t1, t2) + return t1[2] < t2[2] +end +function DF.SortOrder3R (t1, t2) + return t1[3] < t2[3] +end + local onFinish = function (self) if (self.showWhenDone) then self.frame:SetAlpha (1) @@ -462,6 +512,77 @@ return v1 or "topleft", v2, v3 or "topleft", v4 or 0, v5 or 0 end + local anchoring_functions = { + function (frame, anchorTo, offSetX, offSetY) --> 1 TOP LEFT + frame:ClearAllPoints() + frame:SetPoint ("bottomleft", anchorTo, "topleft", offSetX, offSetY) + end, + + function (frame, anchorTo, offSetX, offSetY) --> 2 LEFT + frame:ClearAllPoints() + frame:SetPoint ("right", anchorTo, "left", offSetX, offSetY) + end, + + function (frame, anchorTo, offSetX, offSetY) --> 3 BOTTOM LEFT + frame:ClearAllPoints() + frame:SetPoint ("topleft", anchorTo, "bottomleft", offSetX, offSetY) + end, + + function (frame, anchorTo, offSetX, offSetY) --> 4 BOTTOM + frame:ClearAllPoints() + frame:SetPoint ("top", anchorTo, "bottom", offSetX, offSetY) + end, + + function (frame, anchorTo, offSetX, offSetY) --> 5 BOTTOM RIGHT + frame:ClearAllPoints() + frame:SetPoint ("topright", anchorTo, "bottomright", offSetX, offSetY) + end, + + function (frame, anchorTo, offSetX, offSetY) --> 6 RIGHT + frame:ClearAllPoints() + frame:SetPoint ("left", anchorTo, "right", offSetX, offSetY) + end, + + function (frame, anchorTo, offSetX, offSetY) --> 7 TOP RIGHT + frame:ClearAllPoints() + frame:SetPoint ("bottomright", anchorTo, "topright", offSetX, offSetY) + end, + + function (frame, anchorTo, offSetX, offSetY) --> 8 TOP + frame:ClearAllPoints() + frame:SetPoint ("bottom", anchorTo, "top", offSetX, offSetY) + end, + + function (frame, anchorTo, offSetX, offSetY) --> 9 CENTER + frame:ClearAllPoints() + frame:SetPoint ("center", anchorTo, "center", offSetX, offSetY) + end, + + function (frame, anchorTo, offSetX, offSetY) --> 10 + frame:ClearAllPoints() + frame:SetPoint ("left", anchorTo, "left", offSetX, offSetY) + end, + + function (frame, anchorTo, offSetX, offSetY) --> 11 + frame:ClearAllPoints() + frame:SetPoint ("right", anchorTo, "right", offSetX, offSetY) + end, + + function (frame, anchorTo, offSetX, offSetY) --> 12 + frame:ClearAllPoints() + frame:SetPoint ("top", anchorTo, "top", offSetX, offSetY) + end, + + function (frame, anchorTo, offSetX, offSetY) --> 13 + frame:ClearAllPoints() + frame:SetPoint ("bottom", anchorTo, "bottom", offSetX, offSetY) + end + } + + function DF:SetAnchor (widget, config, anchorTo) + anchorTo = anchorTo or widget:GetParent() + anchoring_functions [config.side] (widget, anchorTo, config.x, config.y) + end ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> colors @@ -550,6 +671,7 @@ local cur_x = x_offset local cur_y = y_offset local max_x = 0 + local line_widgets_created = 0 --how many widgets has been created on this line loop pass height = abs ((height or parent:GetHeight()) - abs (y_offset) + 20) height = height*-1 @@ -567,6 +689,7 @@ label.widget_type = "label" label:SetPoint (cur_x, cur_y) tinsert (parent.widget_list, label) + line_widgets_created = line_widgets_created + 1 elseif (widget_table.type == "select" or widget_table.type == "dropdown") then local dropdown = DF:NewDropDown (parent, nil, "$parentWidget" .. index, nil, 140, 18, widget_table.values, widget_table.get(), dropdown_template) @@ -584,6 +707,7 @@ tinsert (parent.widget_list, dropdown) widget_created = dropdown + line_widgets_created = line_widgets_created + 1 elseif (widget_table.type == "toggle" or widget_table.type == "switch") then local switch = DF:NewSwitch (parent, nil, "$parentWidget" .. index, nil, 60, 20, nil, nil, widget_table.get(), nil, nil, nil, nil, switch_template) @@ -607,6 +731,7 @@ tinsert (parent.widget_list, switch) widget_created = switch + line_widgets_created = line_widgets_created + 1 elseif (widget_table.type == "range" or widget_table.type == "slider") then local is_decimanls = widget_table.usedecimals @@ -631,6 +756,7 @@ tinsert (parent.widget_list, slider) widget_created = slider + line_widgets_created = line_widgets_created + 1 elseif (widget_table.type == "color" or widget_table.type == "color") then local colorpick = DF:NewColorPickButton (parent, "$parentWidget" .. index, nil, widget_table.set, nil, button_template) @@ -656,6 +782,7 @@ tinsert (parent.widget_list, colorpick) widget_created = colorpick + line_widgets_created = line_widgets_created + 1 elseif (widget_table.type == "execute" or widget_table.type == "button") then @@ -675,7 +802,7 @@ tinsert (parent.widget_list, button) widget_created = button - + line_widgets_created = line_widgets_created + 1 elseif (widget_table.type == "textentry") then local textentry = DF:CreateTextEntry (parent, widget_table.func, 120, 18, nil, "$parentWidget" .. index, nil, button_template) @@ -697,6 +824,7 @@ tinsert (parent.widget_list, textentry) widget_created = textentry + line_widgets_created = line_widgets_created + 1 end @@ -713,6 +841,7 @@ if (widget_table.type == "breakline" or cur_y < height) then cur_y = y_offset cur_x = cur_x + max_x + 30 + line_widgets_created = 0 max_x = 0 end @@ -1303,6 +1432,281 @@ return anim end +local frameshake_shake_finished = function (parent, shakeObject) + if (shakeObject.IsPlaying) then + shakeObject.IsPlaying = false + + --> update the amount of shake running on this frame + parent.__frameshakes.enabled = parent.__frameshakes.enabled - 1 + + --> restore the default anchors, in case where deltaTime was too small that didn't triggered an update + for i = 1, #shakeObject.Anchors do + local anchor = shakeObject.Anchors [i] + + if (#anchor == 3) then + local anchorTo, point1, point2 = unpack (anchor) + parent:SetPoint (anchorTo, point1, point2) + + elseif (#anchor == 5) then + local anchorName1, anchorTo, anchorName2, point1, point2 = unpack (anchor) + parent:SetPoint (anchorName1, anchorTo, anchorName2, point1, point2) + end + end + end +end + +local frameshake_do_update = function (parent, shakeObject, deltaTime) + + --> check delta time + deltaTime = deltaTime or 0 + + --> update time left + shakeObject.TimeLeft = max (shakeObject.TimeLeft - deltaTime, 0) + + if (shakeObject.TimeLeft > 0) then + + --> update fade in and out + if (shakeObject.IsFadingIn) then + shakeObject.IsFadingInTime = shakeObject.IsFadingInTime + deltaTime + end + if (shakeObject.IsFadingOut) then + shakeObject.IsFadingOutTime = shakeObject.IsFadingOutTime + deltaTime + end + + --> check if can disable fade in + if (shakeObject.IsFadingIn and shakeObject.IsFadingInTime > shakeObject.FadeInTime) then + shakeObject.IsFadingIn = false + end + + --> check if can enable fade out + if (not shakeObject.IsFadingOut and shakeObject.TimeLeft < shakeObject.FadeOutTime) then + shakeObject.IsFadingOut = true + shakeObject.IsFadingOutTime = shakeObject.FadeOutTime - shakeObject.TimeLeft + end + + --> update position + local scaleShake = min (shakeObject.IsFadingIn and (shakeObject.IsFadingInTime / shakeObject.FadeInTime) or 1, shakeObject.IsFadingOut and (1 - shakeObject.IsFadingOutTime / shakeObject.FadeOutTime) or 1) + + if (scaleShake > 0) then + + --> delate the time by the frequency on both X and Y offsets + shakeObject.XSineOffset = shakeObject.XSineOffset + (deltaTime * shakeObject.Frequency) + shakeObject.YSineOffset = shakeObject.YSineOffset + (deltaTime * shakeObject.Frequency) + + --> calc the new position + local newX, newY + if (shakeObject.AbsoluteSineX) then + --absoluting only the sine wave, passing a negative scale will reverse the absolute direction + newX = shakeObject.Amplitude * abs (math.sin (shakeObject.XSineOffset)) * scaleShake * shakeObject.ScaleX + else + newX = shakeObject.Amplitude * math.sin (shakeObject.XSineOffset) * scaleShake * shakeObject.ScaleX + end + + if (shakeObject.AbsoluteSineY) then + newY = shakeObject.Amplitude * abs (math.sin (shakeObject.YSineOffset)) * scaleShake * shakeObject.ScaleY + else + newY = shakeObject.Amplitude * math.sin (shakeObject.YSineOffset) * scaleShake * shakeObject.ScaleY + end + + --> apply the offset to the frame anchors + for i = 1, #shakeObject.Anchors do + local anchor = shakeObject.Anchors [i] + + if (#anchor == 3) then + local anchorTo, point1, point2 = unpack (anchor) + parent:SetPoint (anchorTo, point1 + newX, point2 + newY) + + elseif (#anchor == 5) then + local anchorName1, anchorTo, anchorName2, point1, point2 = unpack (anchor) + parent:SetPoint (anchorName1, anchorTo, anchorName2, point1 + newX, point2 + newY) + end + end + + end + else + frameshake_shake_finished (parent, shakeObject) + end +end + +local frameshake_update_all = function (parent, deltaTime) + --> check if there's a shake running + --print ("Shakes Enabled: ", parent.__frameshakes.enabled) + if (parent.__frameshakes.enabled > 0) then + --update all shakes + for i = 1, #parent.__frameshakes do + local shakeObject = parent.__frameshakes [i] + if (shakeObject.IsPlaying) then + frameshake_do_update (parent, shakeObject, deltaTime) + end + end + end +end + +--> scale direction scales the X and Y coordinates, scale strength scales the amplitude and frequency +local frameshake_play = function (parent, shakeObject, scaleDirection, scaleAmplitude, scaleFrequency, scaleDuration) + + --> check if is already playing + if (shakeObject.TimeLeft > 0) then + --> reset the time left + shakeObject.TimeLeft = shakeObject.Duration + + if (shakeObject.IsFadingOut) then + if (shakeObject.FadeInTime > 0) then + shakeObject.IsFadingIn = true + --> scale the current fade out into fade in, so it starts the fade in at the point where it was fading out + shakeObject.IsFadingInTime = shakeObject.FadeInTime * (1 - shakeObject.IsFadingOutTime / shakeObject.FadeOutTime) + else + shakeObject.IsFadingIn = false + shakeObject.IsFadingInTime = 0 + end + + --> disable fade out and enable fade in + shakeObject.IsFadingOut = false + shakeObject.IsFadingOutTime = 0 + end + + else + --> create a new random offset + shakeObject.XSineOffset = math.pi * 2 * math.random() + shakeObject.YSineOffset = math.pi * 2 * math.random() + + --> store the initial position if case it needs a reset + shakeObject.StartedXSineOffset = shakeObject.XSineOffset + shakeObject.StartedYSineOffset = shakeObject.YSineOffset + + --> check if there's a fade in time + if (shakeObject.FadeInTime > 0) then + shakeObject.IsFadingIn = true + else + shakeObject.IsFadingIn = false + end + + shakeObject.IsFadingInTime = 0 + shakeObject.IsFadingOut = false + shakeObject.IsFadingOutTime = 0 + + --> apply custom scale + shakeObject.ScaleX = (scaleDirection or 1) * shakeObject.OriginalScaleX + shakeObject.ScaleY = (scaleDirection or 1) * shakeObject.OriginalScaleY + shakeObject.Frequency = (scaleFrequency or 1) * shakeObject.OriginalFrequency + shakeObject.Amplitude = (scaleAmplitude or 1) * shakeObject.OriginalAmplitude + shakeObject.Duration = (scaleDuration or 1) * shakeObject.OriginalDuration + + --> update the time left + shakeObject.TimeLeft = shakeObject.Duration + + --> check if is dynamic points + if (shakeObject.IsDynamicAnchor) then + wipe (shakeObject.Anchors) + for i = 1, parent:GetNumPoints() do + local p1, p2, p3, p4, p5 = parent:GetPoint (i) + shakeObject.Anchors [#shakeObject.Anchors+1] = {p1, p2, p3, p4, p5} + end + end + + --> update the amount of shake running on this frame + parent.__frameshakes.enabled = parent.__frameshakes.enabled + 1 + end + + shakeObject.IsPlaying = true + + frameshake_do_update (parent, shakeObject) +end + +function DF:CreateFrameShake (parent, duration, amplitude, frequency, absoluteSineX, absoluteSineY, scaleX, scaleY, fadeInTime, fadeOutTime, anchorPoints) + + --> create the shake table + local frameShake = { + Amplitude = amplitude or 2, + Frequency = frequency or 5, + Duration = duration or 0.3, + FadeInTime = fadeInTime or 0.01, + FadeOutTime = fadeOutTime or 0.01, + ScaleX = scaleX or 0.2, + ScaleY = scaleY or 1, + AbsoluteSineX = absoluteSineX, + AbsoluteSineY = absoluteSineY, + -- + IsPlaying = false, + TimeLeft = 0, + } + + frameShake.OriginalScaleX = frameShake.ScaleX + frameShake.OriginalScaleY = frameShake.ScaleY + frameShake.OriginalFrequency = frameShake.Frequency + frameShake.OriginalAmplitude = frameShake.Amplitude + frameShake.OriginalDuration = frameShake.Duration + + if (type (anchorPoints) ~= "table") then + frameShake.IsDynamicAnchor = true + frameShake.Anchors = {} + else + frameShake.Anchors = anchorPoints + end + + --> inject frame shake table into the frame + if (not parent.__frameshakes) then + parent.__frameshakes = { + enabled = 0, + } + parent.PlayFrameShake = frameshake_play + parent.UpdateFrameShake = frameshake_do_update + parent.UpdateAllFrameShake = frameshake_update_all + parent:HookScript ("OnUpdate", frameshake_update_all) + end + + tinsert (parent.__frameshakes, frameShake) + + return frameShake +end + + +----------------------------- +--> glow overlay + +local play_glow_overlay = function (self) + self:Show() + if (self.animOut:IsPlaying()) then + self.animOut:Stop() + end + self.animIn:Play() +end + +local stop_glow_overlay = function (self) + self.animOut:Stop() + self.animIn:Stop() + self:Hide() +end + +local defaultColor = {1, 1, 1, 1} + +--this is most copied from the wow client code, few changes applied to customize it +function DF:CreateGlowOverlay (parent, antsColor, glowColor) + local glowFrame = CreateFrame ("frame", parent:GetName() and "$parentGlow2" or "OverlayActionGlow" .. math.random (1, 10000000), parent, "ActionBarButtonSpellActivationAlert") + + glowFrame.Play = play_glow_overlay + glowFrame.Stop = stop_glow_overlay + + parent.overlay = glowFrame + local frameWidth, frameHeight = parent:GetSize() + + local scale = 1.4 + + --Make the height/width available before the next frame: + parent.overlay:SetSize(frameWidth * scale, frameHeight * scale) + parent.overlay:SetPoint("TOPLEFT", parent, "TOPLEFT", -frameWidth * 0.2, frameHeight * 0.2) + parent.overlay:SetPoint("BOTTOMRIGHT", parent, "BOTTOMRIGHT", frameWidth * 0.2, -frameHeight * 0.2) + + local r, g, b, a = DF:ParseColors (antsColor or defaultColor) + glowFrame.ants:SetVertexColor (r, g, b, a) + + local r, g, b, a = DF:ParseColors (glowColor or defaultColor) + glowFrame.outerGlow:SetVertexColor (r, g, b, a) + + glowFrame.outerGlow:SetScale (1.2) + + return glowFrame +end ----------------------------- --> borders @@ -1327,6 +1731,34 @@ end end +local SetBorderColor = function (self, r, g, b) + for _, texture in ipairs (self.Borders.Layer1) do + texture:SetColorTexture (r, g, b) + end + for _, texture in ipairs (self.Borders.Layer2) do + texture:SetColorTexture (r, g, b) + end + for _, texture in ipairs (self.Borders.Layer3) do + texture:SetColorTexture (r, g, b) + end +end + +local SetLayerVisibility = function (self, layer1Shown, layer2Shown, layer3Shown) + + for _, texture in ipairs (self.Borders.Layer1) do + texture:SetShown (layer1Shown) + end + + for _, texture in ipairs (self.Borders.Layer2) do + texture:SetShown (layer2Shown) + end + + for _, texture in ipairs (self.Borders.Layer3) do + texture:SetShown (layer3Shown) + end + +end + function DF:CreateBorder (parent, alpha1, alpha2, alpha3) parent.Borders = { @@ -1339,6 +1771,8 @@ } parent.SetBorderAlpha = SetBorderAlpha + parent.SetBorderColor = SetBorderColor + parent.SetLayerVisibility = SetLayerVisibility local border1 = parent:CreateTexture (nil, "background") border1:SetPoint ("topleft", parent, "topleft", -1, 1) @@ -1410,6 +1844,115 @@ end + +function DF:CreateBorderWithSpread (parent, alpha1, alpha2, alpha3, size, spread) + + parent.Borders = { + Layer1 = {}, + Layer2 = {}, + Layer3 = {}, + Alpha1 = alpha1 or default_border_color1, + Alpha2 = alpha2 or default_border_color2, + Alpha3 = alpha3 or default_border_color3, + } + + parent.SetBorderAlpha = SetBorderAlpha + parent.SetBorderColor = SetBorderColor + parent.SetLayerVisibility = SetLayerVisibility + + --left + local border1 = parent:CreateTexture (nil, "background") + border1:SetPoint ("topleft", parent, "topleft", -1 + spread, 1 + (-spread)) + border1:SetPoint ("bottomleft", parent, "bottomleft", -1 + spread, -1 + spread) + border1:SetColorTexture (0, 0, 0, alpha1 or default_border_color1) + border1:SetWidth (size) + + local border2 = parent:CreateTexture (nil, "background") + border2:SetPoint ("topleft", parent, "topleft", -2 + spread, 2 + (-spread)) + border2:SetPoint ("bottomleft", parent, "bottomleft", -2 + spread, -2 + spread) + border2:SetColorTexture (0, 0, 0, alpha2 or default_border_color2) + border2:SetWidth (size) + + local border3 = parent:CreateTexture (nil, "background") + border3:SetPoint ("topleft", parent, "topleft", -3 + spread, 3 + (-spread)) + border3:SetPoint ("bottomleft", parent, "bottomleft", -3 + spread, -3 + spread) + border3:SetColorTexture (0, 0, 0, alpha3 or default_border_color3) + border3:SetWidth (size) + + tinsert (parent.Borders.Layer1, border1) + tinsert (parent.Borders.Layer2, border2) + tinsert (parent.Borders.Layer3, border3) + + --top + local border1 = parent:CreateTexture (nil, "background") + border1:SetPoint ("topleft", parent, "topleft", 0 + spread, 1 + (-spread)) + border1:SetPoint ("topright", parent, "topright", 1 + (-spread), 1 + (-spread)) + border1:SetColorTexture (0, 0, 0, alpha1 or default_border_color1) + border1:SetHeight (size) + + local border2 = parent:CreateTexture (nil, "background") + border2:SetPoint ("topleft", parent, "topleft", -1 + spread, 2 + (-spread)) + border2:SetPoint ("topright", parent, "topright", 2 + (-spread), 2 + (-spread)) + border2:SetColorTexture (0, 0, 0, alpha2 or default_border_color2) + border2:SetHeight (size) + + local border3 = parent:CreateTexture (nil, "background") + border3:SetPoint ("topleft", parent, "topleft", -2 + spread, 3 + (-spread)) + border3:SetPoint ("topright", parent, "topright", 3 + (-spread), 3 + (-spread)) + border3:SetColorTexture (0, 0, 0, alpha3 or default_border_color3) + border3:SetHeight (size) + + tinsert (parent.Borders.Layer1, border1) + tinsert (parent.Borders.Layer2, border2) + tinsert (parent.Borders.Layer3, border3) + + --right + local border1 = parent:CreateTexture (nil, "background") + border1:SetPoint ("topright", parent, "topright", 1 + (-spread), 0 + (-spread)) + border1:SetPoint ("bottomright", parent, "bottomright", 1 + (-spread), -1 + spread) + border1:SetColorTexture (0, 0, 0, alpha1 or default_border_color1) + border1:SetWidth (size) + + local border2 = parent:CreateTexture (nil, "background") + border2:SetPoint ("topright", parent, "topright", 2 + (-spread), 1 + (-spread)) + border2:SetPoint ("bottomright", parent, "bottomright", 2 + (-spread), -2 + spread) + border2:SetColorTexture (0, 0, 0, alpha2 or default_border_color2) + border2:SetWidth (size) + + local border3 = parent:CreateTexture (nil, "background") + border3:SetPoint ("topright", parent, "topright", 3 + (-spread), 2 + (-spread)) + border3:SetPoint ("bottomright", parent, "bottomright", 3 + (-spread), -3 + spread) + border3:SetColorTexture (0, 0, 0, alpha3 or default_border_color3) + border3:SetWidth (size) + + tinsert (parent.Borders.Layer1, border1) + tinsert (parent.Borders.Layer2, border2) + tinsert (parent.Borders.Layer3, border3) + + local border1 = parent:CreateTexture (nil, "background") + border1:SetPoint ("bottomleft", parent, "bottomleft", 0 + spread, -1 + spread) + border1:SetPoint ("bottomright", parent, "bottomright", 0 + (-spread), -1 + spread) + border1:SetColorTexture (0, 0, 0, alpha1 or default_border_color1) + border1:SetHeight (size) + + local border2 = parent:CreateTexture (nil, "background") + border2:SetPoint ("bottomleft", parent, "bottomleft", -1 + spread, -2 + spread) + border2:SetPoint ("bottomright", parent, "bottomright", 1 + (-spread), -2 + spread) + border2:SetColorTexture (0, 0, 0, alpha2 or default_border_color2) + border2:SetHeight (size) + + local border3 = parent:CreateTexture (nil, "background") + border3:SetPoint ("bottomleft", parent, "bottomleft", -2 + spread, -3 + spread) + border3:SetPoint ("bottomright", parent, "bottomright", 2 + (-spread), -3 + spread) + border3:SetColorTexture (0, 0, 0, alpha3 or default_border_color3) + border3:SetHeight (size) + + tinsert (parent.Borders.Layer1, border1) + tinsert (parent.Borders.Layer2, border2) + tinsert (parent.Borders.Layer3, border3) + +end + function DF:ReskinSlider (slider, heightOffset) if (slider.slider) then slider.cima:SetNormalTexture ([[Interface\Buttons\Arrow-Up-Up]]) @@ -1451,49 +1994,76 @@ slider.slider.thumb:SetTexCoord (482/512, 492/512, 104/512, 120/512) slider.slider.thumb:SetSize (12, 12) slider.slider.thumb:SetVertexColor (0.6, 0.6, 0.6, 0.95) + else + --up button + do + local normalTexture = slider.ScrollBar.ScrollUpButton.Normal + normalTexture:SetTexture ([[Interface\Buttons\Arrow-Up-Up]]) + normalTexture:SetTexCoord (0, 1, .2, 1) + + normalTexture:SetPoint ("topleft", slider.ScrollBar.ScrollUpButton, "topleft", 1, 0) + normalTexture:SetPoint ("bottomright", slider.ScrollBar.ScrollUpButton, "bottomright", 1, 0) + + local pushedTexture = slider.ScrollBar.ScrollUpButton.Pushed + pushedTexture:SetTexture ([[Interface\Buttons\Arrow-Up-Down]]) + pushedTexture:SetTexCoord (0, 1, .2, 1) + + pushedTexture:SetPoint ("topleft", slider.ScrollBar.ScrollUpButton, "topleft", 1, 0) + pushedTexture:SetPoint ("bottomright", slider.ScrollBar.ScrollUpButton, "bottomright", 1, 0) - slider.ScrollBar.ScrollUpButton:SetNormalTexture ([[Interface\Buttons\Arrow-Up-Up]]) - slider.ScrollBar.ScrollUpButton:GetNormalTexture():SetTexCoord (0, 1, 0, 1) - slider.ScrollBar.ScrollUpButton:SetPushedTexture ([[Interface\Buttons\Arrow-Up-Down]]) - slider.ScrollBar.ScrollUpButton:GetPushedTexture():SetTexCoord (0, 1, 0, 1) - slider.ScrollBar.ScrollUpButton:SetDisabledTexture ([[Interface\Buttons\Arrow-Up-Disabled]]) - slider.ScrollBar.ScrollUpButton:GetDisabledTexture():SetTexCoord (0, 1, 0, 1) + local disabledTexture = slider.ScrollBar.ScrollUpButton.Disabled + disabledTexture:SetTexture ([[Interface\Buttons\Arrow-Up-Disabled]]) + disabledTexture:SetTexCoord (0, 1, .2, 1) + disabledTexture:SetAlpha (.5) + + disabledTexture:SetPoint ("topleft", slider.ScrollBar.ScrollUpButton, "topleft", 1, 0) + disabledTexture:SetPoint ("bottomright", slider.ScrollBar.ScrollUpButton, "bottomright", 1, 0) + + slider.ScrollBar.ScrollUpButton:SetSize (16, 16) + slider.ScrollBar.ScrollUpButton:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = "Interface\\Tooltips\\UI-Tooltip-Background"}) + slider.ScrollBar.ScrollUpButton:SetBackdropColor (0, 0, 0, 0.3) + slider.ScrollBar.ScrollUpButton:SetBackdropBorderColor (0, 0, 0, 1) + + --it was having problems with the texture anchor when calling ClearAllPoints() and setting new points different from the original + --now it is using the same points from the original with small offsets tp align correctly + end + + --down button + do + local normalTexture = slider.ScrollBar.ScrollDownButton.Normal + normalTexture:SetTexture ([[Interface\Buttons\Arrow-Down-Up]]) + normalTexture:SetTexCoord (0, 1, 0, .8) + + normalTexture:SetPoint ("topleft", slider.ScrollBar.ScrollDownButton, "topleft", 1, -4) + normalTexture:SetPoint ("bottomright", slider.ScrollBar.ScrollDownButton, "bottomright", 1, -4) + + local pushedTexture = slider.ScrollBar.ScrollDownButton.Pushed + pushedTexture:SetTexture ([[Interface\Buttons\Arrow-Down-Down]]) + pushedTexture:SetTexCoord (0, 1, 0, .8) + + pushedTexture:SetPoint ("topleft", slider.ScrollBar.ScrollDownButton, "topleft", 1, -4) + pushedTexture:SetPoint ("bottomright", slider.ScrollBar.ScrollDownButton, "bottomright", 1, -4) + + local disabledTexture = slider.ScrollBar.ScrollDownButton.Disabled + disabledTexture:SetTexture ([[Interface\Buttons\Arrow-Down-Disabled]]) + disabledTexture:SetTexCoord (0, 1, 0, .8) + disabledTexture:SetAlpha (.5) + + disabledTexture:SetPoint ("topleft", slider.ScrollBar.ScrollDownButton, "topleft", 1, -4) + disabledTexture:SetPoint ("bottomright", slider.ScrollBar.ScrollDownButton, "bottomright", 1, -4) + + slider.ScrollBar.ScrollDownButton:SetSize (16, 16) + slider.ScrollBar.ScrollDownButton:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = "Interface\\Tooltips\\UI-Tooltip-Background"}) + slider.ScrollBar.ScrollDownButton:SetBackdropColor (0, 0, 0, 0.3) + slider.ScrollBar.ScrollDownButton:SetBackdropBorderColor (0, 0, 0, 1) - slider.ScrollBar.ScrollUpButton:SetSize (16, 16) - slider.ScrollBar.ScrollUpButton:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = "Interface\\Tooltips\\UI-Tooltip-Background"}) - slider.ScrollBar.ScrollUpButton:SetBackdropColor (0, 0, 0, 0.3) - slider.ScrollBar.ScrollUpButton:SetBackdropBorderColor (0, 0, 0, 1) - - slider.ScrollBar.ScrollUpButton:GetNormalTexture():ClearAllPoints() - slider.ScrollBar.ScrollUpButton:GetPushedTexture():ClearAllPoints() - slider.ScrollBar.ScrollUpButton:GetDisabledTexture():ClearAllPoints() - slider.ScrollBar.ScrollUpButton:GetNormalTexture():SetPoint ("center", slider.ScrollBar.ScrollUpButton, "center", 1, 1) - slider.ScrollBar.ScrollUpButton:GetPushedTexture():SetPoint ("center", slider.ScrollBar.ScrollUpButton, "center", 1, 1) - slider.ScrollBar.ScrollUpButton:GetDisabledTexture():SetPoint ("center", slider.ScrollBar.ScrollUpButton, "center", 1, 1) - + --<Anchor point="TOP" relativePoint="BOTTOM"/> + --slider.ScrollBar.ScrollDownButton:SetPoint ("top", slider.ScrollBar, "bottom", 0, 0) + end + -- - slider.ScrollBar.ScrollDownButton:SetNormalTexture ([[Interface\Buttons\Arrow-Down-Up]]) - slider.ScrollBar.ScrollDownButton:GetNormalTexture():SetTexCoord (0, 1, 0, 1) - slider.ScrollBar.ScrollDownButton:SetPushedTexture ([[Interface\Buttons\Arrow-Down-Down]]) - slider.ScrollBar.ScrollDownButton:GetPushedTexture():SetTexCoord (0, 1, 0, 1) - slider.ScrollBar.ScrollDownButton:SetDisabledTexture ([[Interface\Buttons\Arrow-Down-Disabled]]) - slider.ScrollBar.ScrollDownButton:GetDisabledTexture():SetTexCoord (0, 1, 0, 1) - - slider.ScrollBar.ScrollDownButton:SetSize (16, 16) - slider.ScrollBar.ScrollDownButton:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = "Interface\\Tooltips\\UI-Tooltip-Background"}) - slider.ScrollBar.ScrollDownButton:SetBackdropColor (0, 0, 0, 0.3) - slider.ScrollBar.ScrollDownButton:SetBackdropBorderColor (0, 0, 0, 1) - - slider.ScrollBar.ScrollDownButton:GetNormalTexture():ClearAllPoints() - slider.ScrollBar.ScrollDownButton:GetPushedTexture():ClearAllPoints() - slider.ScrollBar.ScrollDownButton:GetDisabledTexture():ClearAllPoints() - slider.ScrollBar.ScrollDownButton:GetNormalTexture():SetPoint ("center", slider.ScrollBar.ScrollDownButton, "center", 1, -5) - slider.ScrollBar.ScrollDownButton:GetPushedTexture():SetPoint ("center", slider.ScrollBar.ScrollDownButton, "center", 1, -5) - slider.ScrollBar.ScrollDownButton:GetDisabledTexture():SetPoint ("center", slider.ScrollBar.ScrollDownButton, "center", 1, -5) - - -- slider.ScrollBar:SetPoint ("TOPLEFT", slider, "TOPRIGHT", 6, -16) slider.ScrollBar:SetPoint ("BOTTOMLEFT", slider, "BOTTOMRIGHT", 6, 16 + (heightOffset and heightOffset*-1 or 0)) @@ -1508,4 +2078,57 @@ end end ---doo elsee \ No newline at end of file +function DF:GetCurrentSpec() + local specIndex = GetSpecialization() + if (specIndex) then + local specID = GetSpecializationInfo (specIndex) + if (specID and specID ~= 0) then + return specID + end + end +end + +local specs_per_class = { + ["DEMONHUNTER"] = {577, 581}, + ["DEATHKNIGHT"] = {250, 251, 252}, + ["WARRIOR"] = {71, 72, 73}, + ["MAGE"] = {62, 63, 64}, + ["ROGUE"] = {259, 260, 261}, + ["DRUID"] = {102, 103, 104, 105}, + ["HUNTER"] = {253, 254, 255}, + ["SHAMAN"] = {262, 263, 254}, + ["PRIEST"] = {256, 257, 258}, + ["WARLOCK"] = {265, 266, 267}, + ["PALADIN"] = {65, 66, 70}, + ["MONK"] = {268, 269, 270}, +} + +function DF:GetClassSpecIDs (class) + return specs_per_class [class] +end + +local dispatch_error = function (context, errortext) + DF:Msg ( (context or "<no context>") .. " |cFFFF9900error|r: " .. (errortext or "<no error given>")) +end + +--> safe call an external func with payload and without telling who is calling +function DF:QuickDispatch (func, ...) + if (type (func) ~= "function") then + return + end + + local okay, errortext = pcall (func, ...) + + if (not okay) then + --> trigger an error msg + dispatch_error (_, errortext) + return + end + + return true +end + + + +--doo elsee +--was doing double loops due to not enought height
--- a/Libs/DF/help.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/help.lua Fri Jul 20 19:04:12 2018 -0300 @@ -120,4 +120,4 @@ return help -end \ No newline at end of file +end
--- a/Libs/DF/label.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/label.lua Fri Jul 20 19:04:12 2018 -0300 @@ -325,4 +325,4 @@ end return LabelObject -end \ No newline at end of file +end
--- a/Libs/DF/load.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/load.xml Fri Jul 20 19:04:12 2018 -0300 @@ -8,6 +8,7 @@ <Script file="picture.lua"/> <Script file="slider.lua"/> <Script file="scrollbar.lua"/> + <Script file="spells.lua"/> <Script file="math.lua"/> <Include file="tutorial_alert.xml"/> @@ -21,4 +22,4 @@ <Script file="pictureedit.lua"/> <Script file="auras.lua"/> -</Ui> \ No newline at end of file +</Ui>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Libs/DF/math.lua Fri Jul 20 19:04:12 2018 -0300 @@ -0,0 +1,108 @@ + + +local DF = _G ["DetailsFramework"] +if (not DF or not DetailsFrameworkCanLoad) then + return +end + +local UnitExists = UnitExists +local atan2 = math.atan2 +local pi = math.pi +local abs = math.abs + +SMALL_FLOAT = 0.000001 + +--find distance between two players +function DF:GetDistance_Unit (unit1, unit2) + if (UnitExists (unit1) and UnitExists (unit2)) then + local u1X, u1Y = UnitPosition (unit1) + local u2X, u2Y = UnitPosition (unit2) + + local dX = u2X - u1X + local dY = u2Y - u1Y + + return ((dX*dX) + (dY*dY)) ^ .5 + end + return 0 +end + +--find distance between two points +function DF:GetDistance_Point (x1, y1, x2, y2) + local dx = x2 - x1 + local dy = y2 - y1 + return ((dx * dx) + (dy * dy)) ^ .5 +end + +--find a rotation for an object from a point to another point +function DF:FindLookAtRotation (x1, y1, x2, y2) + return atan2 (y2 - y1, x2 - x1) + pi +end + +--find the value scale between two given values. e.g: value of 500 in a range 0-100 result in 10 in a scale for 0-10 +function DF:MapRangeClamped (inputX, inputY, outputX, outputY, value) + return DF:GetRangeValue (outputX, outputY, Clamp (DF:GetRangePercent (inputX, inputY, value), 0, 1)) +end + +--find the value scale between two given values. e.g: value of 75 in a range 0-100 result in 7.5 in a scale for 0-10 +function DF:MapRangeUnclamped (inputX, inputY, outputX, outputY, value) + return DF:GetRangeValue (outputX, outputY, DF:GetRangePercent (inputX, inputY, value)) +end + +--find the normalized percent of the value in the range. e.g range of 200-400 and a value of 250 result in 0.25 +function DF:GetRangePercent (minValue, maxValue, value) + return (value - minValue) / (maxValue - minValue) +end + +--find the value in the range given from a normalized percent. e.g range of 200-400 and a percent of 0.8 result in 360 +function DF:GetRangeValue (minValue, maxValue, percent) + return Lerp (minValue, maxValue, percent) +end + +--dot product of two 2D Vectors +function DF:GetDotProduct (value1, value2) + return (value1.x * value2.x) + (value1.y * value2.y) +end + +--normalized value 0-1 result in the value on the range given, e.g 200-400 range with a value of .5 result in 300 +function DF:LerpNorm (minValue, maxValue, value) + return (minValue + value * (maxValue - minValue)) +end + +--change the color by the deltaTime +function DF:LerpLinearColor (deltaTime, interpSpeed, r1, g1, b1, r2, g2, b2) + deltaTime = deltaTime * interpSpeed + local r = r1 + (r2 - r1) * deltaTime + local g = g1 + (g2 - g1) * deltaTime + local b = b1 + (b2 - b1) * deltaTime + return r, g, b +end + +--check if a number is near another number by a tolerance +function DF:IsNearlyEqual (value1, value2, tolerance) + tolerance = tolerance or SMALL_FLOAT + return abs (value1 - value2) <= tolerance +end + +--check if a number is near zero +function DF:IsNearlyZero (value, tolerance) + tolerance = tolerance or SMALL_FLOAT + return abs (value) <= tolerance +end + +--check if a number is within a two other numbers, if isInclusive is true, it'll include the max value +function DF:IsWithin (minValue, maxValue, value, isInclusive) + if (isInclusive) then + return ((value >= minValue) and (value <= maxValue)) + else + return ((value >= minValue) and (value < maxValue)) + end +end + +--dont allow a number ot be lower or bigger than a certain range +function DF:Clamp (minValue, maxValue, value) + return value < minValue and minValue or value < maxValue and value or maxValue +end + +function DF:ScaleBack () + +end
--- a/Libs/DF/normal_bar.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/normal_bar.lua Fri Jul 20 19:04:12 2018 -0300 @@ -212,6 +212,11 @@ return _object._texture:SetVertexColor (_value1, _value2, _value3, _value4) end + --> background color + local smember_backgroundcolor = function (_object, _value) + local _value1, _value2, _value3, _value4 = DF:ParseColors (_value) + return _object.background:SetVertexColor (_value1, _value2, _value3, _value4) + end --> icon local smember_icon = function (_object, _value) if (type (_value) == "table") then @@ -255,6 +260,20 @@ end return end + --> background texture + local smember_backgroundtexture = function (_object, _value) + if (_value:find ("\\")) then + _object.background:SetTexture (_value) + else + local file = SharedMedia:Fetch ("statusbar", _value) + if (file) then + _object.background:SetTexture (file) + else + _object.background:SetTexture (_value) + end + end + return + end --> font face local smember_textfont = function (_object, _value) DF:SetFontFace (_object.textleft, _value) @@ -286,8 +305,10 @@ BarMetaFunctions.SetMembers["righttext"] = smember_rtext BarMetaFunctions.SetMembers["lefttext"] = smember_ltext BarMetaFunctions.SetMembers["color"] = smember_color + BarMetaFunctions.SetMembers["backgroundcolor"] = smember_backgroundcolor BarMetaFunctions.SetMembers["icon"] = smember_icon BarMetaFunctions.SetMembers["texture"] = smember_texture + BarMetaFunctions.SetMembers["backgroundtexture"] = smember_backgroundtexture BarMetaFunctions.SetMembers["fontsize"] = smember_textsize BarMetaFunctions.SetMembers["fontface"] = smember_textfont BarMetaFunctions.SetMembers["fontcolor"] = smember_textcolor
--- a/Libs/DF/normal_bar.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/normal_bar.xml Fri Jul 20 19:04:12 2018 -0300 @@ -95,4 +95,4 @@ </OnLoad> </Scripts> </StatusBar> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/DF/panel.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/panel.lua Fri Jul 20 19:04:12 2018 -0300 @@ -29,6 +29,40 @@ local PanelMetaFunctions = _G [DF.GlobalWidgetControlNames ["panel"]] +--> mixin for options functions +DF.OptionsFunctions = { + SetOption = function (self, optionName, optionValue) + if (self.options) then + self.options [optionName] = optionValue + else + self.options = {} + self.options [optionName] = optionValue + end + end, + + GetOption = function (self, optionName) + return self.options and self.options [optionName] + end, + + GetAllOptions = function (self) + if (self.options) then + local optionsTable = {} + for key, _ in pairs (self.options) do + optionsTable [#optionsTable + 1] = key + end + return optionsTable + else + return {} + end + end, + + BuildOptionsTable = function (self, defaultOptions, userOptions) + self.options = self.options or {} + DF.table.deploy (self.options, userOptions or {}) + DF.table.deploy (self.options, defaultOptions or {}) + end +} + ------------------------------------------------------------------------------------------------------------ --> metatables @@ -1216,19 +1250,21 @@ DF.IconPickFrame = CreateFrame ("frame", "DetailsFrameworkIconPickFrame", UIParent) tinsert (UISpecialFrames, "DetailsFrameworkIconPickFrame") - DF.IconPickFrame:SetFrameStrata ("DIALOG") + DF.IconPickFrame:SetFrameStrata ("TOOLTIP") DF.IconPickFrame:SetPoint ("center", UIParent, "center") DF.IconPickFrame:SetWidth (350) - DF.IconPickFrame:SetHeight (227) + DF.IconPickFrame:SetHeight (277) DF.IconPickFrame:EnableMouse (true) DF.IconPickFrame:SetMovable (true) + DF:CreateTitleBar (DF.IconPickFrame, "Icon Picker") + DF.IconPickFrame:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) DF.IconPickFrame:SetBackdropBorderColor (0, 0, 0) DF.IconPickFrame:SetBackdropColor (24/255, 24/255, 24/255, .8) - DF.IconPickFrame:SetFrameLevel (1) + DF.IconPickFrame:SetFrameLevel (5000) DF.IconPickFrame:SetScript ("OnMouseDown", function (self) if (not self.isMoving) then @@ -1249,16 +1285,29 @@ DF.IconPickFrame.preview = CreateFrame ("frame", nil, UIParent) DF.IconPickFrame.preview:SetFrameStrata ("tooltip") + DF.IconPickFrame.preview:SetFrameLevel (6001) DF.IconPickFrame.preview:SetSize (76, 76) + + local preview_image_bg = DF:NewImage (DF.IconPickFrame.preview, nil, 76, 76) + preview_image_bg:SetDrawLayer ("background", 0) + preview_image_bg:SetAllPoints (DF.IconPickFrame.preview) + preview_image_bg:SetColorTexture (0, 0, 0) + local preview_image = DF:NewImage (DF.IconPickFrame.preview, nil, 76, 76) preview_image:SetAllPoints (DF.IconPickFrame.preview) + DF.IconPickFrame.preview.icon = preview_image DF.IconPickFrame.preview:Hide() + --serach DF.IconPickFrame.searchLabel = DF:NewLabel (DF.IconPickFrame, nil, "$parentSearchBoxLabel", nil, "search:", font, size, color) - DF.IconPickFrame.searchLabel:SetPoint ("topleft", DF.IconPickFrame, "topleft", 12, -20) + DF.IconPickFrame.searchLabel:SetPoint ("topleft", DF.IconPickFrame, "topleft", 12, -36) + DF.IconPickFrame.searchLabel:SetTemplate (DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")) + DF.IconPickFrame.search = DF:NewTextEntry (DF.IconPickFrame, nil, "$parentSearchBox", nil, 140, 20) DF.IconPickFrame.search:SetPoint ("left", DF.IconPickFrame.searchLabel, "right", 2, 0) + DF.IconPickFrame.search:SetTemplate (DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")) + DF.IconPickFrame.search:SetHook ("OnTextChanged", function() DF.IconPickFrame.searching = DF.IconPickFrame.search:GetText() if (DF.IconPickFrame.searching == "") then @@ -1273,12 +1322,48 @@ end end) + --manually enter the icon path + DF.IconPickFrame.customIcon = DF:CreateLabel (DF.IconPickFrame, "Icon Path:", DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")) + DF.IconPickFrame.customIcon:SetPoint ("bottomleft", DF.IconPickFrame, "bottomleft", 12, 16) + + DF.IconPickFrame.customIconEntry = DF:CreateTextEntry (DF.IconPickFrame, function()end, 200, 20, "CustomIconEntry", _, _, DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")) + DF.IconPickFrame.customIconEntry:SetPoint ("left", DF.IconPickFrame.customIcon, "right", 2, 0) + + DF.IconPickFrame.customIconEntry:SetHook ("OnTextChanged", function() + DF.IconPickFrame.preview:SetPoint ("bottom", DF.IconPickFrame.customIconEntry.widget, "top", 0, 2) + DF.IconPickFrame.preview.icon:SetTexture (DF.IconPickFrame.customIconEntry:GetText()) + DF.IconPickFrame.preview:Show() + end) + + DF.IconPickFrame.customIconEntry:SetHook ("OnEnter", function() + DF.IconPickFrame.preview:SetPoint ("bottom", DF.IconPickFrame.customIconEntry.widget, "top", 0, 2) + DF.IconPickFrame.preview.icon:SetTexture (DF.IconPickFrame.customIconEntry:GetText()) + DF.IconPickFrame.preview:Show() + end) + --> close button local close_button = CreateFrame ("button", nil, DF.IconPickFrame, "UIPanelCloseButton") close_button:SetWidth (32) close_button:SetHeight (32) close_button:SetPoint ("TOPRIGHT", DF.IconPickFrame, "TOPRIGHT", -8, -7) close_button:SetFrameLevel (close_button:GetFrameLevel()+2) + close_button:SetAlpha (0) --just hide, it is used below + + --> accept custom icon button + local accept_custom_icon = function() + local path = DF.IconPickFrame.customIconEntry:GetText() + + DF:QuickDispatch (DF.IconPickFrame.callback, path, DF.IconPickFrame.param1, DF.IconPickFrame.param2) + + if (DF.IconPickFrame.click_close) then + close_button:Click() + end + end + + DF.IconPickFrame.customIconAccept = DF:CreateButton (DF.IconPickFrame, accept_custom_icon, 82, 20, "Accept", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"), DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")) + DF.IconPickFrame.customIconAccept:SetPoint ("left", DF.IconPickFrame.customIconEntry, "right", 2, 0) + + --fill with icons local MACRO_ICON_FILENAMES = {} local SPELLNAMES_CACHE = {} @@ -1320,18 +1405,25 @@ GetLooseMacroIcons (MACRO_ICON_FILENAMES) GetMacroIcons (MACRO_ICON_FILENAMES) GetMacroItemIcons (MACRO_ICON_FILENAMES) - + + --reset the custom icon text entry + DF.IconPickFrame.customIconEntry:SetText ("") + --reset the search text entry + DF.IconPickFrame.search:SetText ("") end) DF.IconPickFrame:SetScript ("OnHide", function() wipe (MACRO_ICON_FILENAMES) + DF.IconPickFrame.preview:Hide() collectgarbage() end) DF.IconPickFrame.buttons = {} local OnClickFunction = function (self) - DF.IconPickFrame.callback (self.icon:GetTexture(), DF.IconPickFrame.param1, DF.IconPickFrame.param2) + + DF:QuickDispatch (DF.IconPickFrame.callback, self.icon:GetTexture(), DF.IconPickFrame.param1, DF.IconPickFrame.param2) + if (DF.IconPickFrame.click_close) then close_button:Click() end @@ -1362,7 +1454,7 @@ newcheck:SetScript ("OnClick", OnClickFunction) newcheck.param1 = i+1 - newcheck:SetPoint ("topleft", DF.IconPickFrame, "topleft", 12 + (i*30), -40) + newcheck:SetPoint ("topleft", DF.IconPickFrame, "topleft", 12 + (i*30), -60) newcheck:SetID (i+1) DF.IconPickFrame.buttons [#DF.IconPickFrame.buttons+1] = newcheck newcheck:SetScript ("OnEnter", onenter) @@ -1455,6 +1547,7 @@ end local scroll = CreateFrame ("ScrollFrame", "DetailsFrameworkIconPickFrameScroll", DF.IconPickFrame, "ListScrollFrameTemplate") + DF:ReskinSlider (scroll) local ChecksFrame_Update = function (self) @@ -1527,7 +1620,7 @@ DF.IconPickFrame.updateFunc = ChecksFrame_Update - scroll:SetPoint ("topleft", DF.IconPickFrame, "topleft", -18, -37) + scroll:SetPoint ("topleft", DF.IconPickFrame, "topleft", -18, -58) scroll:SetWidth (330) scroll:SetHeight (178) scroll:SetScript ("OnVerticalScroll", function (self, offset) FauxScrollFrame_OnVerticalScroll (scroll, offset, 20, ChecksFrame_Update) end) @@ -1609,9 +1702,12 @@ local SimplePanel_frame_backdrop_color = {0, 0, 0, 0.9} local SimplePanel_frame_backdrop_border_color = {0, 0, 0, 1} +--with_label was making the frame stay in place while its parent moves +--the slider was anchoring to with_label and here here were anchoring the slider again function DF:CreateScaleBar (frame, config) - local scaleBar = DF:CreateSlider (frame, 120, 14, 0.6, 1.6, 0.1, config.scale, true, "ScaleBar", nil, "Scale:", DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE"), DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) - scaleBar:SetPoint ("right", frame.Close, "left", -26, 0) + local scaleBar, text = DF:CreateSlider (frame, 120, 14, 0.6, 1.6, 0.1, config.scale, true, "ScaleBar", nil, "Scale:", DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE"), DF:GetTemplate ("font", "ORANGE_FONT_TEMPLATE")) + --scaleBar:SetPoint ("right", frame.Close, "left", -26, 0) + text:SetPoint ("topleft", frame, "topleft", 12, -7) scaleBar:SetFrameLevel (DF.FRAMELEVEL_OVERLAY) scaleBar.OnValueChanged = function (_, _, value) config.scale = value @@ -1622,6 +1718,10 @@ scaleBar:SetHook ("OnMouseUp", function() frame:SetScale (config.scale) end) + + scaleBar:SetAlpha (0.2) + + return scaleBar end local no_options = {} @@ -3531,15 +3631,20 @@ tabButton.mainFrame = mainFrame DF.TabContainerFunctions.CreateUnderlineGlow (tabButton) + local right_click_to_back if (i == 1) then - local right_click_to_back = DF:CreateLabel (f, "right click to close", 10, "gray") + right_click_to_back = DF:CreateLabel (f, "right click to close", 10, "gray") right_click_to_back:SetPoint ("bottomright", f, "bottomright", -1, 0) f.IsFrontPage = true else - local right_click_to_back = DF:CreateLabel (f, "right click to go back to main menu", 10, "gray") + right_click_to_back = DF:CreateLabel (f, "right click to go back to main menu", 10, "gray") right_click_to_back:SetPoint ("bottomright", f, "bottomright", -1, 0) end + if (options_table.hide_click_label) then + right_click_to_back:Hide() + end + f:SetScript ("OnMouseDown", DF.TabContainerFunctions.OnMouseDown) f:SetScript ("OnMouseUp", DF.TabContainerFunctions.OnMouseUp) @@ -3607,6 +3712,18 @@ widget:SetHook ("OnEnter", simple_list_box_onenter) widget:SetHook ("OnLeave", simple_list_box_onleave) widget.textcolor = self.options.textcolor + widget.textsize = self.options.text_size + widget.onleave_backdrop = self.options.backdrop_color + + widget.XButton = DF:CreateButton (widget, function()end, 16, 16) + widget.XButton:SetPoint ("topright", widget.widget, "topright") + widget.XButton:SetIcon ([[Interface\BUTTONS\UI-Panel-MinimizeButton-Up]], 16, 16, "overlay", nil, nil, 0, -4, 0, false) + widget.XButton.icon:SetDesaturated (true) + + if (not self.options.show_x_button) then + widget.XButton:Hide() + end + tinsert (self.widgets, widget) end self.nextWidget = self.nextWidget + 1 @@ -3620,16 +3737,29 @@ local widget = self:GetOrCreateWidget() widget:SetPoint ("topleft", self, "topleft", 1, -self.options.row_height * (self.nextWidget-2) - 4) widget:SetPoint ("topright", self, "topright", -1, -self.options.row_height * (self.nextWidget-2) - 4) + widget:SetClickFunction (self.func, value) + + if (self.options.show_x_button) then + widget.XButton:SetClickFunction (self.options.x_button_func, value) + widget.XButton.value = value + widget.XButton:Show() + else + widget.XButton:Hide() + end + widget.value = value if (self.options.icon) then if (type (self.options.icon) == "string" or type (self.options.icon) == "number") then - widget:SetIcon (self.options.icon, self.options.row_height, self.options.row_height) + local coords = type (self.options.iconcoords) == "table" and self.options.iconcoords or {0, 1, 0, 1} + widget:SetIcon (self.options.icon, self.options.row_height - 2, self.options.row_height - 2, "overlay", coords) + elseif (type (self.options.icon) == "function") then local icon = self.options.icon (value) if (icon) then - widget:SetIcon (icon, self.options.row_height, self.options.row_height) + local coords = type (self.options.iconcoords) == "table" and self.options.iconcoords or {0, 1, 0, 1} + widget:SetIcon (icon, self.options.row_height - 2, self.options.row_height - 2, "overlay", coords) end end else @@ -3652,6 +3782,10 @@ end widget.value = value + + local r, g, b, a = DF:ParseColors (self.options.backdrop_color) + widget:SetBackdropColor (r, g, b, a) + widget:Show() amt = amt + 1 end @@ -3669,7 +3803,12 @@ width = 230, icon = false, text = "", + text_size = 10, textcolor = "wheat", + + backdrop_color = {1, 1, 1, .5}, + panel_border_color = {0, 0, 0, 0.5}, + onenter = function (self, capsule) if (capsule) then capsule.textcolor = "white" @@ -3697,16 +3836,27 @@ f.nextWidget = 1 f.list_table = list_table f.func = function (self, button, value) - onclick (value) + --onclick (value) + DF:QuickDispatch (onclick, value) f:Refresh() end f.widgets = {} - f:SetBackdrop (backdrop) - f:SetBackdropColor (0, 0, 0, 0.3) - f:SetBackdropBorderColor (0, 0, 0, 0.5) + + DF:ApplyStandardBackdrop (f) + f.options = options or {} self.table.deploy (f.options, default_options) + if (f.options.x_button_func) then + local original_X_function = f.options.x_button_func + f.options.x_button_func = function (self, button, value) + DF:QuickDispatch (original_X_function, value) + f:Refresh() + end + end + + f:SetBackdropBorderColor (unpack (f.options.panel_border_color)) + f:SetSize (f.options.width + 2, f.options.height) local name = DF:CreateLabel (f, title, 12, "silver") @@ -3899,6 +4049,8 @@ function DF:CreateScrollBox (parent, name, refresh_func, data, width, height, line_amount, line_height, create_line_func, auto_amount, no_scroll) local scroll = CreateFrame ("scrollframe", name, parent, "FauxScrollFrameTemplate") + DF:ApplyStandardBackdrop (scroll) + scroll:SetSize (width, height) scroll.LineAmount = line_amount scroll.LineHeight = line_height @@ -3950,3 +4102,833 @@ return leftResizer, rightResizer end end + + +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- ~keybind + + +-------------------------------- +--> keybind frame ~key + + +local ignoredKeys = { + ["LSHIFT"] = true, + ["RSHIFT"] = true, + ["LCTRL"] = true, + ["RCTRL"] = true, + ["LALT"] = true, + ["RALT"] = true, + ["UNKNOWN"] = true, +} + +local mouseKeys = { + ["LeftButton"] = "type1", + ["RightButton"] = "type2", + ["MiddleButton"] = "type3", + ["Button4"] = "type4", + ["Button5"] = "type5", + ["Button6"] = "type6", + ["Button7"] = "type7", + ["Button8"] = "type8", + ["Button9"] = "type9", + ["Button10"] = "type10", + ["Button11"] = "type11", + ["Button12"] = "type12", + ["Button13"] = "type13", + ["Button14"] = "type14", + ["Button15"] = "type15", + ["Button16"] = "type16", +} + +local keysToMouse = { + ["type1"] = "LeftButton", + ["type2"] = "RightButton", + ["type3"] = "MiddleButton", + ["type4"] = "Button4", + ["type5"] = "Button5", + ["type6"] = "Button6", + ["type7"] = "Button7", + ["type8"] = "Button8", + ["type9"] = "Button9", + ["type10"] = "Button10", + ["type11"] = "Button11", + ["type12"] = "Button12", + ["type13"] = "Button13", + ["type14"] = "Button14", + ["type15"] = "Button15", + ["type16"] = "Button16", +} + +local keybind_set_data = function (self, new_data_table) + self.Data = new_data_table + self.keybindScroll:UpdateScroll() +end + +function DF:CreateKeybindBox (parent, name, data, callback, width, height, line_amount, line_height) + + local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE") + local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE") + local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE") + local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE") + local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE") + + local SCROLL_ROLL_AMOUNT = line_amount + + --keybind set frame + local new_keybind_frame = CreateFrame ("frame", name, parent) + new_keybind_frame:SetSize (width, height) + + -- keybind scrollframe + local keybindScroll = CreateFrame ("scrollframe", "$parentScrollFrame", new_keybind_frame, "FauxScrollFrameTemplate") + keybindScroll:SetSize (1019, 348) + keybindScroll.Frames = {} + new_keybind_frame.keybindScroll = keybindScroll + + --waiting the player to press a key + new_keybind_frame.IsListening = false + + --check for valid data table + if (type (data) ~= "table") then + print ("error: data must be a table. DF > CreateKeybindBox()") + return + end + + if (not next (data)) then + --> build data table for the character class + local _, unitClass = UnitClass ("player") + if (unitClass) then + local specIds = DF:GetClassSpecIDs (unitClass) + if (specIds) then + for _, specId in ipairs (specIds) do + data [specId] = {} + end + end + end + end + + new_keybind_frame.Data = data + new_keybind_frame.SetData = keybind_set_data + + new_keybind_frame.EditingSpec = DF:GetCurrentSpec() + new_keybind_frame.CurrentKeybindEditingSet = new_keybind_frame.Data [new_keybind_frame.EditingSpec] + + local allSpecButtons = {} + local switch_spec = function (self, button, specID) + new_keybind_frame.EditingSpec = specID + new_keybind_frame.CurrentKeybindEditingSet = new_keybind_frame.Data [specID] + + for _, button in ipairs (allSpecButtons) do + button.selectedTexture:Hide() + end + self.MyObject.selectedTexture:Show() + + --feedback ao jogador uma vez que as keybinds podem ter o mesmo valor + C_Timer.After (.04, function() new_keybind_frame:Hide() end) + C_Timer.After (.06, function() new_keybind_frame:Show() end) + + --atualiza a scroll + keybindScroll:UpdateScroll() + end + + --choose which spec to use + local spec1 = DF:CreateButton (new_keybind_frame, switch_spec, 160, 20, "Spec1 Placeholder Text", 1, _, _, "SpecButton1", _, 0, options_button_template, options_text_template) + local spec2 = DF:CreateButton (new_keybind_frame, switch_spec, 160, 20, "Spec2 Placeholder Text", 1, _, _, "SpecButton2", _, 0, options_button_template, options_text_template) + local spec3 = DF:CreateButton (new_keybind_frame, switch_spec, 160, 20, "Spec3 Placeholder Text", 1, _, _, "SpecButton3", _, 0, options_button_template, options_text_template) + local spec4 = DF:CreateButton (new_keybind_frame, switch_spec, 160, 20, "Spec4 Placeholder Text", 1, _, _, "SpecButton4", _, 0, options_button_template, options_text_template) + + --format the button label and icon with the spec information + local className, class = UnitClass ("player") + local i = 1 + local specIds = DF:GetClassSpecIDs (class) + + for index, specId in ipairs (specIds) do + local button = new_keybind_frame ["SpecButton" .. index] + local spec_id, spec_name, spec_description, spec_icon, spec_background, spec_role, spec_class = GetSpecializationInfoByID (specId) + button.text = spec_name + button:SetClickFunction (switch_spec, specId) + button:SetIcon (spec_icon) + button.specID = specId + + local selectedTexture = button:CreateTexture (nil, "background") + selectedTexture:SetAllPoints() + selectedTexture:SetColorTexture (1, 1, 1, 0.5) + if (specId ~= new_keybind_frame.EditingSpec) then + selectedTexture:Hide() + end + button.selectedTexture = selectedTexture + + tinsert (allSpecButtons, button) + i = i + 1 + end + + local specsTitle = DF:CreateLabel (new_keybind_frame, "Config keys for spec:", 12, "silver") + specsTitle:SetPoint ("topleft", new_keybind_frame, "topleft", 10, mainStartY) + + keybindScroll:SetPoint ("topleft", specsTitle.widget, "bottomleft", 0, -120) + + spec1:SetPoint ("topleft", specsTitle, "bottomleft", 0, -10) + spec2:SetPoint ("topleft", specsTitle, "bottomleft", 0, -30) + spec3:SetPoint ("topleft", specsTitle, "bottomleft", 0, -50) + if (class == "DRUID") then + spec4:SetPoint ("topleft", specsTitle, "bottomleft", 0, -70) + end + + local enter_the_key = CreateFrame ("frame", nil, new_keybind_frame) + enter_the_key:SetFrameStrata ("tooltip") + enter_the_key:SetSize (200, 60) + enter_the_key:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16, edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1}) + enter_the_key:SetBackdropColor (0, 0, 0, 1) + enter_the_key:SetBackdropBorderColor (1, 1, 1, 1) + enter_the_key.text = DF:CreateLabel (enter_the_key, "- Press a keyboard key to bind.\n- Click to bind a mouse button.\n- Press escape to cancel.", 11, "orange") + enter_the_key.text:SetPoint ("center", enter_the_key, "center") + enter_the_key:Hide() + + local registerKeybind = function (self, key) + if (ignoredKeys [key]) then + return + end + if (key == "ESCAPE") then + enter_the_key:Hide() + new_keybind_frame.IsListening = false + new_keybind_frame:SetScript ("OnKeyDown", nil) + return + end + + local bind = (IsShiftKeyDown() and "SHIFT-" or "") .. (IsControlKeyDown() and "CTRL-" or "") .. (IsAltKeyDown() and "ALT-" or "") + bind = bind .. key + + --adiciona para a tabela de keybinds + local keybind = new_keybind_frame.CurrentKeybindEditingSet [self.keybindIndex] + keybind.key = bind + + new_keybind_frame.IsListening = false + new_keybind_frame:SetScript ("OnKeyDown", nil) + + enter_the_key:Hide() + new_keybind_frame.keybindScroll:UpdateScroll() + + DF:QuickDispatch (callback) + end + + local set_keybind_key = function (self, button, keybindIndex) + if (new_keybind_frame.IsListening) then + key = mouseKeys [button] or button + return registerKeybind (new_keybind_frame, key) + end + new_keybind_frame.IsListening = true + new_keybind_frame.keybindIndex = keybindIndex + new_keybind_frame:SetScript ("OnKeyDown", registerKeybind) + + enter_the_key:Show() + enter_the_key:SetPoint ("bottom", self, "top") + end + + local new_key_bind = function (self, button, specID) + tinsert (new_keybind_frame.CurrentKeybindEditingSet, {key = "-none-", action = "_target", actiontext = ""}) + FauxScrollFrame_SetOffset (new_keybind_frame.keybindScroll, max (#new_keybind_frame.CurrentKeybindEditingSet-SCROLL_ROLL_AMOUNT, 0)) + new_keybind_frame.keybindScroll:UpdateScroll() + end + + local set_action_text = function (keybindIndex, _, text) + local keybind = new_keybind_frame.CurrentKeybindEditingSet [keybindIndex] + keybind.actiontext = text + DF:QuickDispatch (callback) + end + + local set_action_on_espace_press = function (textentry, capsule) + capsule = capsule or textentry.MyObject + local keybind = new_keybind_frame.CurrentKeybindEditingSet [capsule.CurIndex] + textentry:SetText (keybind.actiontext) + DF:QuickDispatch (callback) + end + + local lock_textentry = { + ["_target"] = true, + ["_taunt"] = true, + ["_interrupt"] = true, + ["_dispel"] = true, + ["_spell"] = false, + ["_macro"] = false, + } + + local change_key_action = function (self, keybindIndex, value) + local keybind = new_keybind_frame.CurrentKeybindEditingSet [keybindIndex] + keybind.action = value + new_keybind_frame.keybindScroll:UpdateScroll() + DF:QuickDispatch (callback) + end + local fill_action_dropdown = function() + + local locClass, class = UnitClass ("player") + + local taunt = "" + local interrupt = "" + local dispel = "" + + if (type (dispel) == "table") then + local dispelString = "\n" + for specID, spellid in pairs (dispel) do + local specid, specName = GetSpecializationInfoByID (specID) + local spellName = GetSpellInfo (spellid) + dispelString = dispelString .. "|cFFE5E5E5" .. specName .. "|r: |cFFFFFFFF" .. spellName .. "\n" + end + dispel = dispelString + else + dispel = "" + end + + return { + --{value = "_target", label = "Target", onclick = change_key_action, desc = "Target the unit"}, + --{value = "_taunt", label = "Taunt", onclick = change_key_action, desc = "Cast the taunt spell for your class\n\n|cFFFFFFFFSpell: " .. taunt}, + --{value = "_interrupt", label = "Interrupt", onclick = change_key_action, desc = "Cast the interrupt spell for your class\n\n|cFFFFFFFFSpell: " .. interrupt}, + --{value = "_dispel", label = "Dispel", onclick = change_key_action, desc = "Cast the interrupt spell for your class\n\n|cFFFFFFFFSpell: " .. dispel}, + {value = "_spell", label = "Cast Spell", onclick = change_key_action, desc = "Type the spell name in the text box"}, + {value = "_macro", label = "Run Macro", onclick = change_key_action, desc = "Type your macro in the text box"}, + } + end + + local copy_keybind = function (self, button, keybindIndex) + local keybind = new_keybind_frame.CurrentKeybindEditingSet [keybindIndex] + for specID, t in pairs (new_keybind_frame.Data) do + if (specID ~= new_keybind_frame.EditingSpec) then + local key = CopyTable (keybind) + local specid, specName = GetSpecializationInfoByID (specID) + tinsert (new_keybind_frame.Data [specID], key) + DF:Msg ("Keybind copied to " .. specName) + end + end + DF:QuickDispatch (callback) + end + + local delete_keybind = function (self, button, keybindIndex) + tremove (new_keybind_frame.CurrentKeybindEditingSet, keybindIndex) + new_keybind_frame.keybindScroll:UpdateScroll() + DF:QuickDispatch (callback) + end + + local newTitle = DF:CreateLabel (new_keybind_frame, "Create a new Keybind:", 12, "silver") + newTitle:SetPoint ("topleft", new_keybind_frame, "topleft", 200, mainStartY) + local createNewKeybind = DF:CreateButton (new_keybind_frame, new_key_bind, 160, 20, "New Key Bind", 1, _, _, "NewKeybindButton", _, 0, options_button_template, options_text_template) + createNewKeybind:SetPoint ("topleft", newTitle, "bottomleft", 0, -10) + --createNewKeybind:SetIcon ([[Interface\Buttons\UI-GuildButton-PublicNote-Up]]) + + local update_keybind_list = function (self) + + local keybinds = new_keybind_frame.CurrentKeybindEditingSet + FauxScrollFrame_Update (self, #keybinds, SCROLL_ROLL_AMOUNT, 21) + local offset = FauxScrollFrame_GetOffset (self) + + for i = 1, SCROLL_ROLL_AMOUNT do + local index = i + offset + local f = self.Frames [i] + local data = keybinds [index] + + if (data) then + --index + f.Index.text = index + --keybind + local keyBindText = keysToMouse [data.key] or data.key + + keyBindText = keyBindText:gsub ("type1", "LeftButton") + keyBindText = keyBindText:gsub ("type2", "RightButton") + keyBindText = keyBindText:gsub ("type3", "MiddleButton") + + f.KeyBind.text = keyBindText + f.KeyBind:SetClickFunction (set_keybind_key, index, nil, "left") + f.KeyBind:SetClickFunction (set_keybind_key, index, nil, "right") + --action + f.ActionDrop:SetFixedParameter (index) + f.ActionDrop:Select (data.action) + --action text + f.ActionText.text = data.actiontext + f.ActionText:SetEnterFunction (set_action_text, index) + f.ActionText.CurIndex = index + + if (lock_textentry [data.action]) then + f.ActionText:Disable() + else + f.ActionText:Enable() + end + + --copy + f.Copy:SetClickFunction (copy_keybind, index) + --delete + f.Delete:SetClickFunction (delete_keybind, index) + + f:Show() + else + f:Hide() + end + end + + self:Show() + end + + + + keybindScroll:SetScript ("OnVerticalScroll", function (self, offset) + FauxScrollFrame_OnVerticalScroll (self, offset, 21, update_keybind_list) + end) + keybindScroll.UpdateScroll = update_keybind_list + + local backdropColor = {.3, .3, .3, .3} + local backdropColorOnEnter = {.6, .6, .6, .6} + local on_enter = function (self) + self:SetBackdropColor (unpack (backdropColorOnEnter)) + end + local on_leave = function (self) + self:SetBackdropColor (unpack (backdropColor)) + end + + local font = "GameFontHighlightSmall" + + for i = 1, SCROLL_ROLL_AMOUNT do + local f = CreateFrame ("frame", "$KeyBindFrame" .. i, keybindScroll) + f:SetSize (1009, 20) + f:SetPoint ("topleft", keybindScroll, "topleft", 0, -(i-1)*29) + f:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) + f:SetBackdropColor (unpack (backdropColor)) + f:SetScript ("OnEnter", on_enter) + f:SetScript ("OnLeave", on_leave) + tinsert (keybindScroll.Frames, f) + + f.Index = DF:CreateLabel (f, "1") + f.KeyBind = DF:CreateButton (f, set_key_bind, 100, 20, "", _, _, _, "SetNewKeybindButton", _, 0, options_button_template, options_text_template) + f.ActionDrop = DF:CreateDropDown (f, fill_action_dropdown, 0, 120, 20, "ActionDropdown", _, options_dropdown_template) + f.ActionText = DF:CreateTextEntry (f, function()end, 660, 20, "TextBox", _, _, options_dropdown_template) + f.Copy = DF:CreateButton (f, copy_keybind, 20, 20, "", _, _, _, "CopyKeybindButton", _, 0, options_button_template, options_text_template) + f.Delete = DF:CreateButton (f, delete_keybind, 16, 20, "", _, _, _, "DeleteKeybindButton", _, 2, options_button_template, options_text_template) + + f.Index:SetPoint ("left", f, "left", 10, 0) + f.KeyBind:SetPoint ("left", f, "left", 43, 0) + f.ActionDrop:SetPoint ("left", f, "left", 150, 0) + f.ActionText:SetPoint ("left", f, "left", 276, 0) + f.Copy:SetPoint ("left", f, "left", 950, 0) + f.Delete:SetPoint ("left", f, "left", 990, 0) + + f.Copy:SetIcon ([[Interface\Buttons\UI-GuildButton-PublicNote-Up]], nil, nil, nil, nil, nil, nil, 4) + f.Delete:SetIcon ([[Interface\Buttons\UI-StopButton]], nil, nil, nil, nil, nil, nil, 4) + + f.Copy.tooltip = "copy this keybind to other specs" + f.Delete.tooltip = "erase this keybind" + + --editbox + f.ActionText:SetJustifyH ("left") + f.ActionText:SetHook ("OnEscapePressed", set_action_on_espace_press) + f.ActionText:SetHook ("OnEditFocusGained", function() + local playerSpells = {} + local tab, tabTex, offset, numSpells = GetSpellTabInfo (2) + for i = 1, numSpells do + local index = offset + i + local spellType, spellId = GetSpellBookItemInfo (index, "player") + if (spellType == "SPELL") then + local spellName = GetSpellInfo (spellId) + tinsert (playerSpells, spellName) + end + end + f.ActionText.WordList = playerSpells + end) + + f.ActionText:SetAsAutoComplete ("WordList") + end + + local header = CreateFrame ("frame", "$parentOptionsPanelFrameHeader", keybindScroll) + header:SetPoint ("bottomleft", keybindScroll, "topleft", 0, 2) + header:SetPoint ("bottomright", keybindScroll, "topright", 0, 2) + header:SetHeight (16) + + header.Index = DF:CreateLabel (header, "Index", DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) + header.Key = DF:CreateLabel (header, "Key", DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) + header.Action = DF:CreateLabel (header, "Action", DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) + header.Macro = DF:CreateLabel (header, "Spell Name / Macro", DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) + header.Copy = DF:CreateLabel (header, "Copy", DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) + header.Delete = DF:CreateLabel (header, "Delete", DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")) + + header.Index:SetPoint ("left", header, "left", 10, 0) + header.Key:SetPoint ("left", header, "left", 43, 0) + header.Action:SetPoint ("left", header, "left", 150, 0) + header.Macro:SetPoint ("left", header, "left", 276, 0) + header.Copy:SetPoint ("left", header, "left", 950, 0) + header.Delete:SetPoint ("left", header, "left", 990, 0) + + new_keybind_frame:SetScript ("OnShow", function() + + --new_keybind_frame.EditingSpec = EnemyGrid.CurrentSpec + --new_keybind_frame.CurrentKeybindEditingSet = EnemyGrid.CurrentKeybindSet + + for _, button in ipairs (allSpecButtons) do + if (new_keybind_frame.EditingSpec ~= button.specID) then + button.selectedTexture:Hide() + else + button.selectedTexture:Show() + end + end + + keybindScroll:UpdateScroll() + end) + + new_keybind_frame:SetScript ("OnHide", function() + if (new_keybind_frame.IsListening) then + new_keybind_frame.IsListening = false + new_keybind_frame:SetScript ("OnKeyDown", nil) + end + end) + + return new_keybind_frame +end + +function DF:BuildKeybindFunctions (data, prefix) + + --~keybind + local classLoc, class = UnitClass ("player") + local bindingList = data + + local bindString = "self:ClearBindings();" + local bindKeyBindTypeFunc = [[local unitFrame = ...;]] + local bindMacroTextFunc = [[local unitFrame = ...;]] + local isMouseBinding + + for i = 1, #bindingList do + local bind = bindingList [i] + local bindType + + --which button to press + if (bind.key:find ("type")) then + local keyNumber = tonumber (bind.key:match ("%d")) + bindType = keyNumber + isMouseBinding = true + else + bindType = prefix .. "" .. i + bindString = bindString .. "self:SetBindingClick (0, '" .. bind.key .. "', self:GetName(), '" .. bindType .. "');" + bindType = "-" .. prefix .. "" .. i + isMouseBinding = nil + end + + --keybind type + local shift, alt, ctrl = bind.key:match ("SHIFT"), bind.key:match ("ALT"), bind.key:match ("CTRL") + local CommandKeys = alt and alt .. "-" or "" + CommandKeys = ctrl and CommandKeys .. ctrl .. "-" or CommandKeys + CommandKeys = shift and CommandKeys .. shift .. "-" or CommandKeys + + local keyBindType + if (isMouseBinding) then + keyBindType = [[unitFrame:SetAttribute ("@COMMANDtype@BINDTYPE", "macro");]] + else + keyBindType = [[unitFrame:SetAttribute ("type@BINDTYPE", "macro");]] + end + + keyBindType = keyBindType:gsub ("@BINDTYPE", bindType) + keyBindType = keyBindType:gsub ("@COMMAND", CommandKeys) + bindKeyBindTypeFunc = bindKeyBindTypeFunc .. keyBindType + + --spell or macro + if (bind.action == "_spell") then + local macroTextLine + if (isMouseBinding) then + macroTextLine = [[unitFrame:SetAttribute ("@COMMANDmacrotext@BINDTYPE", "/cast [@mouseover] @SPELL");]] + else + macroTextLine = [[unitFrame:SetAttribute ("macrotext@BINDTYPE", "/cast [@mouseover] @SPELL");]] + end + macroTextLine = macroTextLine:gsub ("@BINDTYPE", bindType) + macroTextLine = macroTextLine:gsub ("@SPELL", bind.actiontext) + macroTextLine = macroTextLine:gsub ("@COMMAND", CommandKeys) + bindMacroTextFunc = bindMacroTextFunc .. macroTextLine + + elseif (bind.action == "_macro") then + local macroTextLine + if (isMouseBinding) then + macroTextLine = [[unitFrame:SetAttribute ("@COMMANDmacrotext@BINDTYPE", "@MACRO");]] + else + macroTextLine = [[unitFrame:SetAttribute ("macrotext@BINDTYPE", "@MACRO");]] + end + macroTextLine = macroTextLine:gsub ("@BINDTYPE", bindType) + macroTextLine = macroTextLine:gsub ("@MACRO", bind.actiontext) + macroTextLine = macroTextLine:gsub ("@COMMAND", CommandKeys) + bindMacroTextFunc = bindMacroTextFunc .. macroTextLine + + end + end + + --~key + local bindTypeFuncLoaded = loadstring (bindKeyBindTypeFunc) + local bindMacroFuncLoaded = loadstring (bindMacroTextFunc) + + if (not bindMacroFuncLoaded or not bindTypeFuncLoaded) then + return + end + + return bindString, bindTypeFuncLoaded, bindMacroFuncLoaded +end + + +function DF:SetKeybindsOnProtectedFrame (frame, bind_string, bind_type_func, bind_macro_func) + + bind_type_func (frame) + bind_macro_func (frame) + frame:SetAttribute ("_onenter", bind_string) + +end + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +-- ~standard backdrop + +function DF:ApplyStandardBackdrop (f, darkTheme, alphaScale) + alphaScale = alphaScale or 1.0 + + if (darkTheme) then + f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Cooldown\cooldown2]], tileSize = 32, tile = true}) + f:SetBackdropBorderColor (0, 0, 0, 1) + f:SetBackdropColor (.54, .54, .54, .54 * alphaScale) + else + f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) + f:SetBackdropBorderColor (0, 0, 0, 1) + f:SetBackdropColor (0, 0, 0, 0.2 * alphaScale) + end + + if (not f.__background) then + f.__background = f:CreateTexture (nil, "background") + end + + f.__background:SetColorTexture (0.2317647, 0.2317647, 0.2317647) + f.__background:SetVertexColor (0.27, 0.27, 0.27) + f.__background:SetAlpha (0.8 * alphaScale) + f.__background:SetVertTile (true) + f.__background:SetHorizTile (true) + f.__background:SetAllPoints() +end + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +-- ~title bar + +DF.TitleFunctions = { + + SetTitle = function (self, titleText, titleColor, font, size) + self.TitleLabel:SetText (titleText or self.TitleLabel:GetText()) + + if (titleColor) then + local r, g, b, a = DF:ParseColors (titleColor) + self.TitleLabel:SetTextColor (r, g, b, a) + end + + if (font) then + DF:SetFontFace (self.TitleLabel, font) + end + + if (size) then + DF:SetFontSize (self.TitleLabel, size) + end + end + + +} + +function DF:CreateTitleBar (f, titleText) + + local titleBar = CreateFrame ("frame", f:GetName() and f:GetName() .. "TitleBar" or nil, f) + titleBar:SetPoint ("topleft", f, "topleft", 2, -3) + titleBar:SetPoint ("topright", f, "topright", -2, -3) + titleBar:SetHeight (20) + titleBar:SetBackdrop (SimplePanel_frame_backdrop) --it's an upload from this file + titleBar:SetBackdropColor (.2, .2, .2, 1) + titleBar:SetBackdropBorderColor (0, 0, 0, 1) + + local closeButton = CreateFrame ("button", titleBar:GetName() and titleBar:GetName() .. "CloseButton" or nil, titleBar) + closeButton:SetSize (16, 16) + closeButton:SetNormalTexture (DF.folder .. "icons") + closeButton:SetHighlightTexture (DF.folder .. "icons") + closeButton:SetPushedTexture (DF.folder .. "icons") + closeButton:GetNormalTexture():SetTexCoord (0, 16/128, 0, 1) + closeButton:GetHighlightTexture():SetTexCoord (0, 16/128, 0, 1) + closeButton:GetPushedTexture():SetTexCoord (0, 16/128, 0, 1) + closeButton:SetAlpha (0.7) + closeButton:SetScript ("OnClick", simple_panel_close_click) --upvalue from this file + + local titleLabel = titleBar:CreateFontString (titleBar:GetName() and titleBar:GetName() .. "TitleText" or nil, "overlay", "GameFontNormal") + titleLabel:SetTextColor (.8, .8, .8, 1) + titleLabel:SetText (titleText or "") + + --anchors + closeButton:SetPoint ("right", titleBar, "right", -2, 0) + titleLabel:SetPoint ("center", titleBar, "center") + + --members + f.TitleBar = titleBar + f.CloseButton = closeButton + f.TitleLabel = titleLabel + + DF:Mixin (f, DF.TitleFunctions) + + return titleBar +end + + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +-- ~icon row + +DF.IconRowFunctions = { + + GetIcon = function (self) + local iconFrame = self.IconPool [self.NextIcon] + + if (not iconFrame) then + local newIconFrame = CreateFrame ("cooldown", "$parentIconCooldown" .. self.NextIcon, self, "CooldownFrameTemplate") + newIconFrame:SetSize (self.options.icon_width, self.options.icon_height) + + newIconFrame.Texture = newIconFrame:CreateTexture (nil, "background") + newIconFrame.Texture:SetAllPoints() + + newIconFrame.Text = newIconFrame:CreateFontString (nil, "overlay", "GameFontNormal") + newIconFrame.Text:SetPoint ("center") + newIconFrame.Text:Hide() + + newIconFrame:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1}) + newIconFrame:SetBackdropBorderColor (0, 0, 0, 0) + newIconFrame:EnableMouse (false) + + self.IconPool [self.NextIcon] = newIconFrame + iconFrame = newIconFrame + end + + iconFrame:ClearAllPoints() + + local anchor = self.options.anchor + local anchorTo = self.NextIcon == 1 and self or self.IconPool [self.NextIcon - 1] + local xPadding = self.NextIcon == 1 and self.options.left_padding or self.options.icon_padding + local growDirection = self.options.grow_direction + + if (growDirection == 1) then --grow to right + if (self.NextIcon == 1) then + iconFrame:SetPoint ("left", anchorTo, "left", xPadding, 0) + else + iconFrame:SetPoint ("left", anchorTo, "right", xPadding, 0) + end + + elseif (growDirection == 2) then --grow to left + if (self.NextIcon == 1) then + iconFrame:SetPoint ("right", anchorTo, "right", xPadding, 0) + else + iconFrame:SetPoint ("right", anchorTo, "left", xPadding, 0) + end + + end + + DF:SetFontColor (iconFrame.Text, self.options.text_color) + + self.NextIcon = self.NextIcon + 1 + return iconFrame + end, + + SetIcon = function (self, spellId, borderColor, startTime, duration) + local spellName, _, spellIcon = GetSpellInfo (spellId) + + if (spellIcon) then + local iconFrame = self:GetIcon() + iconFrame.Texture:SetTexture (spellIcon) + iconFrame.Texture:SetTexCoord (unpack (self.options.texcoord)) + + if (borderColor) then + iconFrame:SetBackdropBorderColor (Plater:ParseColors (borderColor)) + else + iconFrame:SetBackdropBorderColor (0, 0, 0 ,0) + end + + if (startTime) then + CooldownFrame_Set (iconFrame, startTime, duration, true, true) + + if (self.options.show_text) then + iconFrame.Text:Show() + iconFrame.Text:SetText (floor (startTime + duration - GetTime())) + else + iconFrame.Text:Hide() + end + else + iconFrame.Text:Hide() + end + + iconFrame:Show() + + --> update the size of the frame + self:SetWidth ((self.options.left_padding * 2) + (self.options.icon_padding * (self.NextIcon-2)) + (self.options.icon_width * (self.NextIcon - 1))) + + --> show the frame + self:Show() + + return iconFrame + end + end, + + ClearIcons = function (self) + for i = 1, self.NextIcon -1 do + self.IconPool [i]:Hide() + end + self.NextIcon = 1 + self:Hide() + end, + + GetIconGrowDirection = function (self) + local side = self.options.anchor.side + + if (side == 1) then + return 1 + elseif (side == 2) then + return 2 + elseif (side == 3) then + return 1 + elseif (side == 4) then + return 1 + elseif (side == 5) then + return 2 + elseif (side == 6) then + return 1 + elseif (side == 7) then + return 2 + elseif (side == 8) then + return 1 + elseif (side == 9) then + return 1 + elseif (side == 10) then + return 1 + elseif (side == 11) then + return 2 + elseif (side == 12) then + return 1 + elseif (side == 13) then + return 1 + end + end +} + +local default_icon_row_options = { + icon_width = 20, + icon_height = 20, + texcoord = {.1, .9, .1, .9}, + show_text = true, + text_color = {1, 1, 1, 1}, + left_padding = 2, --distance between right and left + top_padding = 2, --distance between top and bottom + icon_padding = 2, --distance between each icon + backdrop = {edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}, + backdrop_color = {0, 0, 0, 0.5}, + backdrop_border_color = {0, 0, 0, 1}, + anchor = {side = 6, x = 2, y = 0}, + grow_direction = 1, --1 = to right 2 = to left +} + +function DF:CreateIconRow (parent, name, options) + local f = CreateFrame ("frame", name, parent) + f.IconPool = {} + f.NextIcon = 1 + + DF:Mixin (f, DF.IconRowFunctions) + DF:Mixin (f, DF.OptionsFunctions) + + f:BuildOptionsTable (default_icon_row_options, options) + + f:SetSize (f.options.icon_width, f.options.icon_height + (f.options.top_padding * 2)) + f:SetBackdrop (f.options.backdrop) + f:SetBackdropColor (unpack (f.options.backdrop_color)) + f:SetBackdropBorderColor (unpack (f.options.backdrop_border_color)) + + return f +end
--- a/Libs/DF/panel.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/panel.xml Fri Jul 20 19:04:12 2018 -0300 @@ -29,4 +29,4 @@ </Frame> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/DF/picture.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/picture.lua Fri Jul 20 19:04:12 2018 -0300 @@ -295,4 +295,4 @@ setmetatable (ImageObject, ImageMetaFunctions) return ImageObject -end \ No newline at end of file +end
--- a/Libs/DF/pictureedit.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/pictureedit.lua Fri Jul 20 19:04:12 2018 -0300 @@ -598,4 +598,4 @@ end end - \ No newline at end of file +
--- a/Libs/DF/scrollbar.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/scrollbar.lua Fri Jul 20 19:04:12 2018 -0300 @@ -126,7 +126,7 @@ self.precionado = false self:SetScript ("OnUpdate", nil) end) - --> isso aqui pra quando o slider ativar, o scroll fica na posição zero + --> isso aqui pra quando o slider ativar, o scroll fica na posi��o zero botao_cima:SetScript ("OnEnable", function (self) local current = new_slider:GetValue() if (current == 0) then @@ -232,4 +232,4 @@ end return new_slider -end \ No newline at end of file +end
--- a/Libs/DF/slider.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/slider.lua Fri Jul 20 19:04:12 2018 -0300 @@ -338,7 +338,6 @@ --> scripts local OnEnter = function (slider) - if (_rawget (slider.MyObject, "lockdown")) then return end @@ -362,8 +361,8 @@ GameCooltip2:AddLine (slider.MyObject.have_tooltip) GameCooltip2:ShowCooltip (slider, "tooltip") else - GameCooltip2:Preset (1) - GameCooltip2:AddLine ("Right Click to Type the Value") + GameCooltip2:Preset (2) + GameCooltip2:AddLine ("Right Click to Type the Value", "", 1, "", "", 10) GameCooltip2:AddIcon ([[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]], 1, 1, 16, 16, 0.015625, 0.15671875, 0.640625, 0.798828125) GameCooltip2:ShowCooltip (slider, "tooltip") end @@ -396,7 +395,6 @@ local f = CreateFrame ("frame", "DetailsFrameworkSliderButtons1", UIParent) f:Hide() - --f:SetBackdrop ({bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]], tile = true, tileSize = 5}) f:SetHeight (18) local t = 0 @@ -413,8 +411,9 @@ function f:ShowMe (host) f:SetPoint ("bottomleft", host, "topleft", -3, -5) f:SetPoint ("bottomright", host, "topright", 3, -5) - f:SetFrameStrata (host:GetFrameStrata()) - f:SetFrameLevel (host:GetFrameLevel()) + --f:SetFrameStrata (host:GetFrameStrata()) + f:SetFrameStrata ("FULLSCREEN") + f:SetFrameLevel (host:GetFrameLevel() + 1000) f:Show() if (f.is_going_hide) then f:SetScript ("OnUpdate", nil) @@ -1146,7 +1145,6 @@ SliderObject.slider:SetBackdrop ({edgeFile = "Interface\\Buttons\\UI-SliderBar-Border", edgeSize = 8}) SliderObject.slider:SetBackdropColor (0.9, 0.7, 0.7, 1.0) - --SliderObject.slider:SetBackdropColor (0, 0, 0, 1) SliderObject.thumb = SliderObject.slider:CreateTexture (nil, "artwork") SliderObject.thumb:SetTexture ("Interface\\Buttons\\UI-ScrollBar-Knob") @@ -1218,4 +1216,4 @@ return SliderObject, with_label -end \ No newline at end of file +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Libs/DF/spells.lua Fri Jul 20 19:04:12 2018 -0300 @@ -0,0 +1,596 @@ + +local DF = _G ["DetailsFramework"] +if (not DF or not DetailsFrameworkCanLoad) then + return +end + +DF.CooldownsBySpec = { + -- 1 attack cooldown + -- 2 personal defensive cooldown + -- 3 targetted defensive cooldown + -- 4 raid defensive cooldown + -- 5 personal utility cooldown + + --MAGE + --arcane + [62] = { + [12042] = 1, --Arcane Power + [55342] = 1, --Mirror Image + [45438] = 2, --Ice Block + [12051] = 5, --Evocation + [110960] = 5, --Greater Invisibility + }, + --fire + [63] = { + [190319] = 1, --Combustion + [55342] = 1, --Mirror Image + [45438] = 2, --Ice Block + [66] = 5, --Invisibility + }, + --frost + [64] = { + [12472] = 1, --Icy Veins + [205021] = 1, --Ray of Frost + [55342] = 1, --Mirror Image + [45438] = 2, --Ice Block + [66] = 5, --Invisibility + [235219] = 5, --Cold Snap + }, + + --PRIEST + --discipline + [256] = { + [34433] = 1, --Shadowfiend + [123040] = 1, --Mindbender + [33206] = 3, --Pain Suppression + [62618] = 4, --Power Word: Barrier + [271466] = 4, --Luminous Barrier (talent) + [47536] = 5, --Rapture + [19236] = 5, --Desperate Prayer + [8122] = 5, --Psychic Scream + }, + --holy + [257] = { + [200183] = 2, --Apotheosis + [47788] = 3, --Guardian Spirit + [64844] = 4, --Divine Hymn + [64901] = 4, --Symbol of Hope + [265202] = 4, --Holy Word: Salvation + [88625] = 5, --Holy Word: Chastise + [34861] = 5, --Holy Word: Sanctify + [2050] = 5, --Holy Word: Serenity + [19236] = 5, --Desperate Prayer + [8122] = 5, --Psychic Scream + }, + --shadow priest + [258] = { + [34433] = 1, --Shadowfiend + [200174] = 1, --Mindbender + [193223] = 1, --Surrender to Madness + [47585] = 2, --Dispersion + [15286] = 4, --Vampiric Embrace + [64044] = 5, --Psychic Horror + [8122] = 5, --Psychic Scream + }, + + --ROGUE + --assassination + [259] = { + [79140] = 1, --Vendetta + [1856] = 2, --Vanish + [5277] = 2, --Evasion + [31224] = 2, --Cloak of Shadows + [2094] = 5, --Blind + [114018] = 5, --Shroud of Concealment + }, + --outlaw + [260] = { + [13750] = 1, --Adrenaline Rush + [51690] = 1, --Killing Spree (talent) + [199754] = 2, --Riposte + [31224] = 2, --Cloak of Shadows + [1856] = 2, --Vanish + [2094] = 5, --Blind + [114018] = 5, --Shroud of Concealment + }, + --subtlety + [261] = { + [121471] = 1, --Shadow Blades + [31224] = 2, --Cloak of Shadows + [1856] = 2, --Vanish + [5277] = 2, --Evasion + [2094] = 5, --Blind + [114018] = 5, --Shroud of Concealment + }, + + --WARLOCK + --affliction + [265] = { + [205180] = 1, --Summon Darkglare + [113860] = 1, --Dark Soul: Misery + [104773] = 2, --Unending Resolve + + [108416] = 2, --Dark Pact + + [30283] = 5, --Shadowfury + [6789] = 5, --Mortal Coil + }, + --demo + [266] = { + [265187] = 1, --Summon Demonic Tyrant + [111898] = 1, --Grimoire: Felguard + [267217] = 1, --Nether Portal + + [104773] = 2, --Unending Resolve + [108416] = 2, --Dark Pact + + [30283] = 5, --Shadowfury + [6789] = 5, --Mortal Coil + }, + --destro + [267] = { + [1122] = 1, --Summon Infernal + [113858] = 1, --Dark Soul: Instability + + [104773] = 2, --Unending Resolve + [108416] = 2, --Dark Pact + + [6789] = 5, --Mortal Coil + [30283] = 5, --Shadowfury + }, + + --WARRIOR + --Arms + [71] = { + [107574] = 1, --Avatar + [227847] = 1, --Bladestorm + [152277] = 1, --Ravager (talent) + + [118038] = 2, --Die by the Sword + + [97462] = 4, --Rallying Cry + + [18499] = 5, --Berserker Rage + [5246] = 5, --Intimidating Shout + }, + --Fury + [72] = { + [1719] = 1, --Recklessness + [46924] = 1, --Bladestorm (talent) + + [184364] = 2, --Enraged Regeneration + + [97462] = 4, --Rallying Cry + + [18499] = 5, --Berserker Rage + [5246] = 5, --Intimidating Shout + }, + --Protection + [73] = { + [228920] = 1, --Ravager (talent) + [107574] = 1, --Avatar + + [12975] = 2, --Last Stand + [871] = 2, --Shield Wall + + [97462] = 4, --Rallying Cry + + [18499] = 5, --Berserker Rage + [5246] = 5, --Intimidating Shout + }, + + --PALADIN + --holy + [65] = { + [31884] = 1, --Avenging Wrath + [216331] = 1, --Avenging Crusader (talent) + + [498] = 2, --Divine Protection + [642] = 2, --Divine Shield + [105809] = 2, --Holy Avenger (talent) + + [1022] = 3, --Blessing of Protection + [633] = 3, --Lay on Hands + + [31821] = 4, --Aura Mastery + + [1044] = 5, --Blessing of Freedom + [853] = 5, --Hammer of Justice + [115750] = 5, --Blinding Light (talent) + }, + + --protection + [66] = { + [31884] = 1, --Avenging Wrath + + [31850] = 2, --Ardent Defender + [86659] = 2, --Guardian of Ancient Kings + + [1022] = 3, --Blessing of Protection + [204018] = 3, --Blessing of Spellwarding (talent) + [6940] = 3, --Blessing of Sacrifice + + [204150] = 4, --Aegis of Light (talent) + + [1044] = 5, --Blessing of Freedom + [853] = 5, --Hammer of Justice + [115750] = 5, --Blinding Light (talent) + }, + + --retribution + [70] = { + [31884] = 1, --Avenging Wrath + [231895] = 1, --Crusade (talent) + + [184662] = 2, --Shield of Vengeance + [642] = 2, --Divine Shield + + [1022] = 3, --Blessing of Protection + [633] = 3, --Lay on Hands + + [1044] = 5, --Blessing of Freedom + [853] = 5, --Hammer of Justice + [115750] = 5, --Blinding Light (talent) + }, + + --DEMON HUNTER + --havoc + [577] = { + [200166] = 1, --Metamorphosis + [206491] = 1, --Nemesis (talent) + + [196555] = 2, --Netherwalk (talent) + + [196718] = 4, --Darkness + }, + --vengeance + [581] = { + [187827] = 2, --Metamorphosis + + [207684] = 5, --Sigil of Misery + [202137] = 5, --Sigil of Silence + [202138] = 5, --Sigil of Chains (talent) + }, + + --DEATH KNIGHT + --unholy + [252] = { + [275699] = 1, --Apocalypse + [42650] = 1, --Army of the Dead + [49206] = 1, --Summon Gargoyle (talent) + + [48792] = 2, --Icebound Fortitude + [48743] = 2, --Death Pact (talent) + + }, + --frost + [251] = { + [152279] = 1, --Breath of Sindragosa (talent) + [47568] = 1, --Empower Rune Weapon + [279302] = 1, --Frostwyrm's Fury (talent) + + [48792] = 2, --Icebound Fortitude + [48743] = 2, --Death Pact (talent) + + [207167] = 5, --Blinding Sleet (talent) + }, + --blood + [250] = { + [49028] = 1, --Dancing Rune Weapon + + [55233] = 2, --Vampiric Blood + [48792] = 2, --Icebound Fortitude + + [108199] = 5, --Gorefiend's Grasp + }, + + --DRUID + --balance + [102] = { + [194223] = 1, --Celestial Alignment + [102560] = 1, --Incarnation: Chosen of Elune (talent) + + [22812] = 2, --Barkskin + [108238] = 2, --Renewal (talent) + + [29166] = 3, --Innervate + + [78675] = 5, --Solar Beam + }, + --feral + [103] = { + [106951] = 1, --Berserk + [102543] = 1, --Incarnation: King of the Jungle (talent) + + [61336] = 2, --Survival Instincts + [108238] = 2, --Renewal (talent) + + [77764] = 4, --Stampeding Roar + }, + --guardian + [104] = { + [22812] = 2, --Barkskin + [61336] = 2, --Survival Instincts + [102558] = 2, --Incarnation: Guardian of Ursoc (talent) + + [77761] = 4, --Stampeding Roar + + [99] = 5, --Incapacitating Roar + }, + --restoration + [105] = { + + [22812] = 2, --Barkskin + [108238] = 2, --Renewal (talent) + [33891] = 2, --Incarnation: Tree of Life (talent) + + [102342] = 3, --Ironbark + [29166] = 3, --Innervate + + [740] = 4, --Tranquility + [197721] = 4, --Flourish (talent) + + [102793] = 5, --Ursol's Vortex + }, + + --HUNTER + --beast mastery + [253] = { + [193530] = 1, --Aspect of the Wild + [19574] = 1, --Bestial Wrath + [201430] = 1, --Stampede (talent) + [194407] = 1, --Spitting Cobra (talent) + + [186265] = 2, --Aspect of the Turtle + + [19577] = 5, --Intimidation + }, + --marksmanship + [254] = { + [193526] = 1, --Trueshot + + [186265] = 2, --Aspect of the Turtle + [109304] = 2, --Exhilaration + [281195] = 2, --Survival of the Fittest + + [187650] = 5, --Freezing Trap + }, + --survival + [255] = { + [266779] = 1, --Coordinated Assault + + [186265] = 2, --Aspect of the Turtle + [109304] = 2, --Exhilaration + + [19577] = 5, --Intimidation + }, + + --MONK + --brewmaster + [268] = { + [115203] = 2, --Fortifying Brew + [115176] = 2, --Zen Meditation + [122278] = 2, --Dampen Harm (talent) + }, + --windwalker + [269] = { + [137639] = 1, --Storm, Earth, and Fire + [123904] = 1, --Invoke Xuen, the White Tiger (talent) + [152173] = 1, --Serenity (talent) + + [122470] = 2, --Touch of Karma + [122278] = 2, --Dampen Harm (talent) + [122783] = 2, --Diffuse Magic (talent) + + [119381] = 5, --Leg Sweep + }, + --mistweaver + [270] = { + [122278] = 2, --Dampen Harm (talent) + [198664] = 2, --Invoke Chi-Ji, the Red Crane (talent) + [243435] = 2, --Fortifying Brew + [122783] = 2, --Diffuse Magic (talent) + + [116849] = 3, --Life Cocoon + + [115310] = 4, --Revival + }, + + --SHAMAN + --elemental + [262] = { + [198067] = 1, --Fire Elemental + [192249] = 1, --Storm Elemental (talent) + [114050] = 1, --Ascendance (talent) + + [108271] = 2, --Astral Shift + + [108281] = 4, --Ancestral Guidance (talent) + }, + --enhancement + [263] = { + [51533] = 1, --Feral Spirit + [114051] = 1, --Ascendance (talent) + + [108271] = 2, --Astral Shift + }, + --restoration + [263] = { + [108271] = 2, --Astral Shift + [114052] = 2, --Ascendance (talent) + [98008] = 4, --Spirit Link Totem + [108280] = 4, --Healing Tide Totem + [207399] = 4, --Ancestral Protection Totem (talent) + }, +} + +DF.CrowdControlSpells = { + [5246] = "WARRIOR", --Intimidating Shout + [132168] = "WARRIOR", --Shockwave (debuff spellid) + [132169] = "WARRIOR", --Storm Bolt (talent debuff spellid) + + [118699] = "WARLOCK", --Fear (debuff spellid) + [6789] = "WARLOCK", --Mortal Coil + [30283] = "WARLOCK", --Shadowfury + [710] = "WARLOCK", --Banish + + [118] = "MAGE", --Polymorph + [82691] = "MAGE", --Ring of Frost (debuff spellid) + [122] = "MAGE", --Frost Nova + [157997] = "MAGE", --Ice Nova + [31661] = "MAGE", --Dragon's Breath + + [205364] = "PRIEST", --Mind Control (talent) + [605] = "PRIEST", --Mind Control + [8122] = "PRIEST", --Psychic Scream + [9484] = "PRIEST", --Shackle Undead + [200196] = "PRIEST", --Holy Word: Chastise (debuff spellid) + [200200] = "PRIEST", --Holy Word: Chastise (talent debuff spellid) + [226943] = "PRIEST", --Mind Bomb (talent) + [64044] = "PRIEST", --Psychic Horror (talent) + + [2094] = "ROGUE", --Blind + [1833] = "ROGUE", --Cheap Shot + [408] = "ROGUE", --Kidney Shot + [6770] = "ROGUE", --Sap + [1776] = "ROGUE", --Gouge + + [853] = "PALADIN", --Hammer of Justice + [20066] = "PALADIN", --Repentance (talent) + [105421] = "PALADIN", --Blinding Light (talent) + + [221562] = "DEATHKNIGHT", --Asphyxiate + [108194] = "DEATHKNIGHT", --Asphyxiate (talent) + [207167] = "DEATHKNIGHT", --Blinding Sleet + + [339] = "DRUID", --Entangling Roots + [2637] = "DRUID", --Hibernate + [61391] = "DRUID", --Typhoon + [102359] = "DRUID", --Mass Entanglement + [99] = "DRUID", --Incapacitating Roar + [236748] = "DRUID", --Intimidating Roar + [5211] = "DRUID", --Mighty Bash + [45334] = "DRUID", --Immobilized + [203123] = "DRUID", --Maim + [50259] = "DRUID", --Dazed (from Wild Charge) + [209753] = "DRUID", --Cyclone (from pvp talent) + + [3355] = "HUNTER", --Freezing Trap + [19577] = "HUNTER", --Intimidation + [190927] = "HUNTER", --Harpoon + [162480] = "HUNTER", --Steel Trap + + [119381] = "MONK", --Leg Sweep + [115078] = "MONK", --Paralysis + [198909] = "MONK", --Song of Chi-Ji (talent) + [116706] = "MONK", --Disable + + [118905] = "SHAMAN", --Static Charge (Capacitor Totem) + [51514] = "SHAMAN", --Hex + [64695] = "SHAMAN", --Earthgrab (talent) + + [179057] = "DEMONHUNTER", --Chaos Nova + [217832] = "DEMONHUNTER", --Imprison + [200166] = "DEMONHUNTER", --Metamorphosis + [207685] = "DEMONHUNTER", --Sigil of Misery +} + +DF.SpecIds = { + [577] = "DEMONHUNTER", + [581] = "DEMONHUNTER", + + [250] = "DEATHKNIGHT", + [251] = "DEATHKNIGHT", + [252] = "DEATHKNIGHT", + + [71] = "WARRIOR", + [72] = "WARRIOR", + [73] = "WARRIOR", + + [62] = "MAGE", + [63] = "MAGE", + [64] = "MAGE", + + [259] = "ROGUE", + [260] = "ROGUE", + [261] = "ROGUE", + + [102] = "DRUID", + [103] = "DRUID", + [104] = "DRUID", + [105] = "DRUID", + + [253] = "HUNTER", + [254] = "HUNTER", + [255] = "HUNTER", + + [262] = "SHAMAN", + [263] = "SHAMAN", + [254] = "SHAMAN", + + [256] = "PRIEST", + [257] = "PRIEST", + [258] = "PRIEST", + + [265] = "WARLOCK", + [266] = "WARLOCK", + [267] = "WARLOCK", + + [65] = "PALADIN", + [66] = "PALADIN", + [70] = "PALADIN", + + [268] = "MONK", + [269] = "MONK", + [270] = "MONK", +} + +DF.CooldownToClass = {} + +DF.CooldownsAttack = {} +DF.CooldownsDeffense = {} +DF.CooldownsExternals = {} +DF.CooldownsRaid = {} + +DF.CooldownsAllDeffensive = {} + +for specId, cooldownTable in pairs (DF.CooldownsBySpec) do + + for spellId, cooldownType in pairs (cooldownTable) do + + if (cooldownType == 1) then + DF.CooldownsAttack [spellId] = true + + elseif (cooldownType == 2) then + DF.CooldownsDeffense [spellId] = true + DF.CooldownsAllDeffensive [spellId] = true + + elseif (cooldownType == 3) then + DF.CooldownsExternals [spellId] = true + DF.CooldownsAllDeffensive [spellId] = true + + elseif (cooldownType == 4) then + DF.CooldownsRaid [spellId] = true + DF.CooldownsAllDeffensive [spellId] = true + + elseif (cooldownType == 5) then + + + end + + DF.CooldownToClass [spellId] = DF.SpecIds [spellId] + + end + +end + + +function DF:FindClassForCooldown (spellId) + for specId, cooldownTable in pairs (DF.CooldownsBySpec) do + local hasCooldown = cooldownTable [spellId] + if (hasCooldown) then + return DF.SpecIds [specId] + end + end +end +
--- a/Libs/DF/split_bar.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/split_bar.lua Fri Jul 20 19:04:12 2018 -0300 @@ -618,4 +618,4 @@ _setmetatable (SplitBarObject, SplitBarMetaFunctions) return SplitBarObject -end \ No newline at end of file +end
--- a/Libs/DF/split_bar.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/split_bar.xml Fri Jul 20 19:04:12 2018 -0300 @@ -79,4 +79,4 @@ </Scripts> </StatusBar> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/DF/textentry.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/textentry.lua Fri Jul 20 19:04:12 2018 -0300 @@ -14,6 +14,7 @@ local loadstring = loadstring --> lua local local _string_len = string.len --> lua local + local cleanfunction = function() end local APITextEntryFunctions = false @@ -712,69 +713,7 @@ return self.editbox:SetFocus (true) end -function DF:NewSpecialLuaEditorEntry (parent, w, h, member, name, nointent) - - if (name:find ("$parent")) then - local parentName = DF.GetParentName (parent) - name = name:gsub ("$parent", parentName) - end - - local borderframe = CreateFrame ("Frame", name, parent) - borderframe:SetSize (w, h) - - if (member) then - parent [member] = borderframe - end - - local scrollframe = CreateFrame ("ScrollFrame", name, borderframe, "DetailsFrameworkEditBoxMultiLineTemplate") - - scrollframe:SetScript ("OnSizeChanged", function (self) - scrollframe.editbox:SetSize (self:GetSize()) - end) - - scrollframe:SetPoint ("topleft", borderframe, "topleft", 10, -10) - scrollframe:SetPoint ("bottomright", borderframe, "bottomright", -30, 10) - - scrollframe.editbox:SetMultiLine (true) - scrollframe.editbox:SetJustifyH ("left") - scrollframe.editbox:SetJustifyV ("top") - scrollframe.editbox:SetMaxBytes (1024000) - scrollframe.editbox:SetMaxLetters (128000) - - borderframe.GetText = function_gettext - borderframe.SetText = function_settext - borderframe.ClearFocus = function_clearfocus - borderframe.SetFocus = function_setfocus - - borderframe.Enable = TextEntryMetaFunctions.Enable - borderframe.Disable = TextEntryMetaFunctions.Disable - - borderframe.SetTemplate = TextEntryMetaFunctions.SetTemplate - - if (not nointent) then - IndentationLib.enable (scrollframe.editbox, nil, 4) - end - - borderframe:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], - tile = 1, tileSize = 16, edgeSize = 16, insets = {left = 5, right = 5, top = 5, bottom = 5}}) - - scrollframe.editbox.current_bordercolor = {1, 1, 1, 0.7} - borderframe:SetBackdropBorderColor (1, 1, 1, 0.7) - borderframe:SetBackdropColor (0.090195, 0.090195, 0.188234, 1) - - borderframe.enabled_border_color = {borderframe:GetBackdropBorderColor()} - borderframe.enabled_backdrop_color = {borderframe:GetBackdropColor()} - borderframe.enabled_text_color = {scrollframe.editbox:GetTextColor()} - borderframe.onleave_backdrop = {scrollframe.editbox:GetBackdropColor()} - borderframe.onleave_backdrop_border_color = {scrollframe.editbox:GetBackdropBorderColor()} - - borderframe.scroll = scrollframe - borderframe.editbox = scrollframe.editbox - borderframe.editbox.borderframe = borderframe - - return borderframe -end ------------------------------------------------------------------------------------ @@ -893,6 +832,7 @@ local character = text:sub (i, i) if (character:match ("%a")) then self.lastword = character .. self.lastword + --print (self.lastword) else break end @@ -901,7 +841,7 @@ --On Text Changed local AutoComplete_OnTextChanged = function (editboxWidget, byUser, capsule) - capsule = capsule or editboxWidget.MyObject + capsule = capsule or editboxWidget.MyObject or editboxWidget local chars_now = editboxWidget:GetText():len() if (not editboxWidget.ignore_textchange) then @@ -921,7 +861,7 @@ end local AutoComplete_OnSpacePressed = function (editboxWidget, capsule) - capsule = capsule or editboxWidget.MyObject + capsule = capsule or editboxWidget.MyObject or editboxWidget -- if (not gotMatch) then --editboxWidget.end_selection = nil @@ -934,12 +874,12 @@ local AutoComplete_OnEnterPressed = function (editboxWidget) - local capsule = editboxWidget.MyObject + local capsule = editboxWidget.MyObject or editboxWidget if (editboxWidget.end_selection) then editboxWidget:SetCursorPosition (editboxWidget.end_selection) editboxWidget:HighlightText (0, 0) editboxWidget.end_selection = nil - --editboxWidget:Insert (" ") --estava causando a adição de uma palavra a mais quando o próximo catactere for um espaço + --editboxWidget:Insert (" ") --estava causando a adi��o de uma palavra a mais quando o pr�ximo catactere for um espa�o else if (editboxWidget:IsMultiLine()) then editboxWidget:Insert ("\n") @@ -959,26 +899,58 @@ end local AutoComplete_OnEditFocusGained = function (editboxWidget) - local capsule = editboxWidget.MyObject + local capsule = editboxWidget.MyObject or editboxWidget capsule:GetLastWord() + --print ("last word:", editboxWidget.lastword) editboxWidget.end_selection = nil editboxWidget.focusGained = true capsule.characters_count = editboxWidget:GetText():len() end +local OptimizeAutoCompleteTable = function (self, wordList) + local optimizedTable = {} + + local lower = string.lower + local sub = string.sub + local len = string.len + + local subTables = 0 + + for i = 1, #wordList do + local thisWord = wordList [i] + if (len (thisWord) > 0) then + thisWord = lower (thisWord) + + local firstCharacter = sub (thisWord, 1, 1) + + local charTable = optimizedTable [firstCharacter] + if (not charTable) then + charTable = {} + optimizedTable [firstCharacter] = charTable + + subTables = subTables + 1 + end + + charTable [#charTable+1] = thisWord + end + end + + wordList.Optimized = optimizedTable +end + local AutoComplete_OnChar = function (editboxWidget, char, capsule) if (char == "") then return end - capsule = capsule or editboxWidget.MyObject + capsule = capsule or editboxWidget.MyObject or editboxWidget editboxWidget.end_selection = nil if (editboxWidget.ignore_input) then return end - --reseta a palavra se acabou de ganhar focus e apertou espaço + --reseta a palavra se acabou de ganhar focus e apertou espa�o if (editboxWidget.focusGained and char == " ") then capsule.lastword = "" editboxWidget.focusGained = nil @@ -993,13 +965,41 @@ end editboxWidget.ignore_input = true + if (capsule.lastword:len() >= 2) then local wordList = capsule [capsule.poolName] if (not wordList) then - if (DF.debug) then - error ("Details! Framework: Invalid word list table.") + error ("Details! Framework: TextEntry has AutoComplete but no word list table.") + return + end + + if (capsule.ShouldOptimizeAutoComplete) then + if (not wordList.Optimized) then + OptimizeAutoCompleteTable (capsule, wordList) end + + local firstCharacter = string.lower (string.sub (capsule.lastword, 1, 1)) + wordList = wordList.Optimized [firstCharacter] + + if (wordList) then + for i = 1, #wordList do + local thisWord = wordList [i] + if (thisWord and (thisWord:find ("^" .. capsule.lastword) or thisWord:lower():find ("^" .. capsule.lastword))) then + local rest = thisWord:gsub (capsule.lastword, "") + rest = rest:lower():gsub (capsule.lastword, "") + local cursor_pos = editboxWidget:GetCursorPosition() + editboxWidget:Insert (rest) + editboxWidget:HighlightText (cursor_pos, cursor_pos + rest:len()) + editboxWidget:SetCursorPosition (cursor_pos) + editboxWidget.end_selection = cursor_pos + rest:len() + editboxWidget.ignore_textchange = true + break + end + end + end + + editboxWidget.ignore_input = false return end @@ -1017,32 +1017,1420 @@ break end end + end - end editboxWidget.ignore_input = false end -function TextEntryMetaFunctions:SetAsAutoComplete (poolName) +function TextEntryMetaFunctions:SetAsAutoComplete (poolName, poolTable, shouldOptimize) - self.lastword = "" - self.characters_count = 0 - self.poolName = poolName - self.GetLastWord = get_last_word --editbox:GetLastWord() - self.NoClearFocusOnEnterPressed = true --avoid auto clear focus - - self:SetHook ("OnEditFocusGained", AutoComplete_OnEditFocusGained) - self.editbox:HookScript ("OnEscapePressed", AutoComplete_OnEscapePressed) - --- self:SetHook ("OnTextChanged", AutoComplete_OnTextChanged) - self:SetHook ("OnEnterPressed", AutoComplete_OnEnterPressed) --- self:SetHook ("OnChar", AutoComplete_OnChar) --- self:SetHook ("OnSpacePressed", AutoComplete_OnSpacePressed) - - self.editbox:SetScript ("OnTextChanged", AutoComplete_OnTextChanged) --- self.editbox:SetScript ("OnEnterPressed", AutoComplete_OnEnterPressed) - self.editbox:SetScript ("OnChar", AutoComplete_OnChar) - self.editbox:SetScript ("OnSpacePressed", AutoComplete_OnSpacePressed) + if (not self.SetHook) then + --self is borderframe + self = self.editbox + self.editbox = self --compatible with fw functions + + self.lastword = "" + self.characters_count = 0 + self.poolName = poolName + self.GetLastWord = get_last_word --editbox:GetLastWord() + self.NoClearFocusOnEnterPressed = true --avoid auto clear focus + self.ShouldOptimizeAutoComplete = shouldOptimize + + if (poolTable) then + self [poolName] = poolTable + end + + self:HookScript ("OnEditFocusGained", AutoComplete_OnEditFocusGained) + self:HookScript ("OnEnterPressed", AutoComplete_OnEnterPressed) + self:HookScript ("OnEscapePressed", AutoComplete_OnEscapePressed) + self:HookScript ("OnTextChanged", AutoComplete_OnTextChanged) + self:HookScript ("OnChar", AutoComplete_OnChar) + self:HookScript ("OnSpacePressed", AutoComplete_OnSpacePressed) + else + --fw textfield + self.lastword = "" + self.characters_count = 0 + self.poolName = poolName + self.GetLastWord = get_last_word --editbox:GetLastWord() + self.NoClearFocusOnEnterPressed = true --avoid auto clear focus + self.ShouldOptimizeAutoComplete = shouldOptimize + + self:SetHook ("OnEditFocusGained", AutoComplete_OnEditFocusGained) + self:SetHook ("OnEnterPressed", AutoComplete_OnEnterPressed) + self.editbox:HookScript ("OnEscapePressed", AutoComplete_OnEscapePressed) + self.editbox:SetScript ("OnTextChanged", AutoComplete_OnTextChanged) + self.editbox:SetScript ("OnChar", AutoComplete_OnChar) + self.editbox:SetScript ("OnSpacePressed", AutoComplete_OnSpacePressed) + end end --- endp \ No newline at end of file +function DF:NewSpecialLuaEditorEntry (parent, w, h, member, name, nointent) + + if (name:find ("$parent")) then + local parentName = DF.GetParentName (parent) + name = name:gsub ("$parent", parentName) + end + + local borderframe = CreateFrame ("Frame", name, parent) + borderframe:SetSize (w, h) + + if (member) then + parent [member] = borderframe + end + + local scrollframe = CreateFrame ("ScrollFrame", name, borderframe, "DetailsFrameworkEditBoxMultiLineTemplate") + + borderframe.SetAsAutoComplete = TextEntryMetaFunctions.SetAsAutoComplete + + scrollframe:SetScript ("OnSizeChanged", function (self) + scrollframe.editbox:SetSize (self:GetSize()) + end) + + scrollframe:SetPoint ("topleft", borderframe, "topleft", 10, -10) + scrollframe:SetPoint ("bottomright", borderframe, "bottomright", -30, 10) + + scrollframe.editbox:SetMultiLine (true) + scrollframe.editbox:SetJustifyH ("left") + scrollframe.editbox:SetJustifyV ("top") + scrollframe.editbox:SetMaxBytes (1024000) + scrollframe.editbox:SetMaxLetters (128000) + + borderframe.GetText = function_gettext + borderframe.SetText = function_settext + borderframe.ClearFocus = function_clearfocus + borderframe.SetFocus = function_setfocus + + borderframe.Enable = TextEntryMetaFunctions.Enable + borderframe.Disable = TextEntryMetaFunctions.Disable + + borderframe.SetTemplate = TextEntryMetaFunctions.SetTemplate + + if (not nointent) then + IndentationLib.enable (scrollframe.editbox, nil, 4) + end + + borderframe:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], + tile = 1, tileSize = 16, edgeSize = 16, insets = {left = 5, right = 5, top = 5, bottom = 5}}) + + scrollframe.editbox.current_bordercolor = {1, 1, 1, 0.7} + borderframe:SetBackdropBorderColor (1, 1, 1, 0.7) + borderframe:SetBackdropColor (0.090195, 0.090195, 0.188234, 1) + + borderframe.enabled_border_color = {borderframe:GetBackdropBorderColor()} + borderframe.enabled_backdrop_color = {borderframe:GetBackdropColor()} + borderframe.enabled_text_color = {scrollframe.editbox:GetTextColor()} + + borderframe.onleave_backdrop = {scrollframe.editbox:GetBackdropColor()} + borderframe.onleave_backdrop_border_color = {scrollframe.editbox:GetBackdropBorderColor()} + + borderframe.scroll = scrollframe + borderframe.editbox = scrollframe.editbox + borderframe.editbox.borderframe = borderframe + + return borderframe +end + +-- encryption table +local base64chars = {[0]='A',[1]='B',[2]='C',[3]='D',[4]='E',[5]='F',[6]='G',[7]='H',[8]='I',[9]='J',[10]='K',[11]='L',[12]='M',[13]='N',[14]='O',[15]='P',[16]='Q',[17]='R',[18]='S',[19]='T',[20]='U',[21]='V',[22]='W',[23]='X',[24]='Y',[25]='Z',[26]='a',[27]='b',[28]='c',[29]='d',[30]='e',[31]='f',[32]='g',[33]='h',[34]='i',[35]='j',[36]='k',[37]='l',[38]='m',[39]='n',[40]='o',[41]='p',[42]='q',[43]='r',[44]='s',[45]='t',[46]='u',[47]='v',[48]='w',[49]='x',[50]='y',[51]='z',[52]='0',[53]='1',[54]='2',[55]='3',[56]='4',[57]='5',[58]='6',[59]='7',[60]='8',[61]='9',[62]='-',[63]='_'} + +-- decryption table +local base64bytes = {['A']=0,['B']=1,['C']=2,['D']=3,['E']=4,['F']=5,['G']=6,['H']=7,['I']=8,['J']=9,['K']=10,['L']=11,['M']=12,['N']=13,['O']=14,['P']=15,['Q']=16,['R']=17,['S']=18,['T']=19,['U']=20,['V']=21,['W']=22,['X']=23,['Y']=24,['Z']=25,['a']=26,['b']=27,['c']=28,['d']=29,['e']=30,['f']=31,['g']=32,['h']=33,['i']=34,['j']=35,['k']=36,['l']=37,['m']=38,['n']=39,['o']=40,['p']=41,['q']=42,['r']=43,['s']=44,['t']=45,['u']=46,['v']=47,['w']=48,['x']=49,['y']=50,['z']=51,['0']=52,['1']=53,['2']=54,['3']=55,['4']=56,['5']=57,['6']=58,['7']=59,['8']=60,['9']=61,['-']=62,['_']=63,['=']=nil} + +-- shift left +local function lsh (value,shift) + return (value*(2^shift)) % 256 +end + +-- shift right +local function rsh (value,shift) + return math.floor(value/2^shift) % 256 +end + +-- return single bit (for OR) +local function bit (x,b) + return (x % 2^b - x % 2^(b-1) > 0) +end + +local function lor (x,y) + result = 0 + for p=1,8 do result = result + (((bit(x,p) or bit(y,p)) == true) and 2^(p-1) or 0) end + return result +end + +function DF.EncodeString (data) + local bytes = {} + local result = "" + for spos=0,string.len(data)-1,3 do + for byte=1,3 do bytes[byte] = string.byte(string.sub(data,(spos+byte))) or 0 end + result = string.format('%s%s%s%s%s',result,base64chars[rsh(bytes[1],2)],base64chars[lor(lsh((bytes[1] % 4),4), rsh(bytes[2],4))] or "=",((#data-spos) > 1) and base64chars[lor(lsh(bytes[2] % 16,2), rsh(bytes[3],6))] or "=",((#data-spos) > 2) and base64chars[(bytes[3] % 64)] or "=") + end + return result +end + +function DF.DecodeString (data) + local chars = {} + local result="" + for dpos=0,string.len(data)-1,4 do + for char=1,4 do chars[char] = base64bytes[(string.sub(data,(dpos+char),(dpos+char)) or "=")] end + result = string.format('%s%s%s%s',result,string.char(lor(lsh(chars[1],2), rsh(chars[2],4))),(chars[3] ~= nil) and string.char(lor(lsh(chars[2],4), rsh(chars[3],2))) or "",(chars[4] ~= nil) and string.char(lor(lsh(chars[3],6) % 192, (chars[4]))) or "") + end + return result +end + + +DF.AutoCompleteAPI = { + "local", + "AddTrackedAchievement", -- [1] + "CanShowAchievementUI", -- [2] + "ClearAchievementComparisonUnit", -- [3] + "GetAchievementCategory", -- [4] + "GetAchievementComparisonInfo", -- [5] + "GetAchievementCriteriaInfo", -- [6] + "GetAchievementInfo", -- [7] + "GetAchievementInfoFromCriteria", -- [8] + "GetAchievementLink", -- [9] + "GetAchievementNumCriteria", -- [10] + "GetAchievementNumRewards", -- [11] + "GetCategoryInfo", -- [12] + "GetCategoryList", -- [13] + "GetCategoryNumAchievements", -- [14] + "GetComparisonAchievementPoints", -- [15] + "GetComparisonCategoryNumAchievements", -- [16] + "GetComparisonStatistic", -- [17] + "GetLatestCompletedAchievements", -- [18] + "GetLatestCompletedComparisonAchievements", -- [19] + "GetLatestUpdatedComparisonStatsGetLatestUpdatedStats", -- [20] + "GetNextAchievement", -- [21] + "GetNumComparisonCompletedAchievements", -- [22] + "GetNumCompletedAchievements", -- [23] + "GetPreviousAchievement", -- [24] + "GetStatistic", -- [25] + "GetStatisticsCategoryList", -- [26] + "GetTotalAchievementPoints", -- [27] + "GetTrackedAchievements", -- [28] + "GetNumTrackedAchievements", -- [29] + "RemoveTrackedAchievement", -- [30] + "SetAchievementComparisonUnit", -- [31] + "ActionButtonDown", -- [32] + "ActionButtonUp", -- [33] + "ActionHasRange", -- [34] + "CameraOrSelectOrMoveStart", -- [35] + "CameraOrSelectOrMoveStop", -- [36] + "ChangeActionBarPage", -- [37] + "GetActionBarPage", -- [38] + "GetActionBarToggles", -- [39] + "GetActionCooldown", -- [40] + "GetActionCount", -- [41] + "GetActionInfo", -- [42] + "GetActionText", -- [43] + "GetActionTexture", -- [44] + "GetBonusBarOffset", -- [45] + "GetMouseButtonClicked", -- [46] + "GetMultiCastBarOffset", -- [47] + "GetPossessInfo", -- [48] + "HasAction", -- [49] + "IsActionInRange", -- [50] + "IsAttackAction", -- [51] + "IsAutoRepeatAction", -- [52] + "IsCurrentAction", -- [53] + "IsConsumableAction", -- [54] + "IsEquippedAction", -- [55] + "IsUsableAction", -- [56] + "PetHasActionBar", -- [57] + "PickupAction", -- [58] + "PickupPetAction", -- [59] + "PlaceAction", -- [60] + "SetActionBarToggles", -- [61] + "StopAttack", -- [62] + "TurnOrActionStart", -- [63] + "TurnOrActionStop", -- [64] + "UseAction", -- [65] + "AcceptDuel", -- [66] + "AttackTarget", -- [67] + "CancelDuel", -- [68] + "CancelLogout", -- [69] + "ClearTutorials", -- [70] + "CancelSummon", -- [71] + "ConfirmSummon", -- [72] + "DescendStop", -- [73] + "Dismount", -- [74] + "FlagTutorial", -- [75] + "ForceQuit", -- [76] + "GetPVPTimer", -- [77] + "GetSummonConfirmAreaName", -- [78] + "GetSummonConfirmSummoner", -- [79] + "GetSummonConfirmTimeLeft", -- [80] + "RandomRoll", -- [81] + "SetPVP", -- [82] + "StartDuel", -- [84] + "TogglePVP", -- [85] + "ToggleSheath", -- [86] + "UseSoulstone", -- [87] + "CanSolveArtifact", -- [89] + "UIParent", -- [90] + "GetArtifactInfoByRace", -- [91] + "GetArtifactProgress", -- [92] + "GetNumArtifactsByRace", -- [93] + "GetSelectedArtifactInfo", -- [94] + "IsArtifactCompletionHistoryAvailable", -- [95] + "ItemAddedToArtifact", -- [96] + "RemoveItemFromArtifact", -- [97] + "RequestArtifactCompletionHistory", -- [98] + "SocketItemToArtifact", -- [99] + "AcceptArenaTeam", -- [101] + "ArenaTeamInviteByName", -- [102] + "ArenaTeamSetLeaderByName", -- [103] + "ArenaTeamLeave", -- [104] + "ArenaTeamRoster", -- [105] + "ArenaTeamUninviteByName", -- [106] + "ArenaTeamDisband", -- [107] + "DeclineArenaTeam", -- [108] + "GetArenaTeam", -- [109] + "GetArenaTeamGdfInf", -- [110] + "oGetArenaTeamRosterInfo", -- [111] + "GetBattlefieldTeamInfo", -- [112] + "GetCurrentArenaSeason", -- [113] + "GetInspectArenaTeamData", -- [114] + "GetNumArenaTeamMembers", -- [115] + "GetPreviousArenaSeason", -- [116] + "IsActiveBattlefieldArena", -- [117] + "IsArenaTeamCaptain", -- [118] + "IsInArenaTeam", -- [119] + "CalculateAuctionDeposit", -- [121] + "CanCancelAuction", -- [122] + "CancelSell", -- [123] + "CanSendAuctionQuery", -- [124] + "CancelAuction", -- [125] + "ClickAuctionSellItemButton", -- [126] + "CloseAuctionHouse", -- [127] + "GetAuctionHouseDepositRate", -- [128] + "GetAuctionInvTypes", -- [129] + "GetAuctionItemClasses", -- [130] + "GetAuctionItemInfo", -- [131] + "GetAuctionItemLink", -- [132] + "GetAuctionItemSubClasses", -- [133] + "GetAuctionItemTimeLeft", -- [134] + "GetAuctionSellItemInfo", -- [135] + "GetBidderAuctionItems", -- [136] + "GetNumAuctionItems", -- [137] + "GetOwnerAuctionItems", -- [138] + "GetSelectedAuctionItem", -- [139] + "IsAuctionSortReversed", -- [140] + "PlaceAuctionBid", -- [141] + "QueryAuctionItems", -- [142] + "SetAuctionsTabShowing", -- [143] + "SetSelectedAuctionItem", -- [144] + "SortAuctionItems", -- [145] + "StartAuction", -- [146] + "BankButtonIDToInvSlotID", -- [148] + "CloseBankFrame", -- [149] + "GetBankSlotCost", -- [150] + "GetNumBankSlots", -- [151] + "PurchaseSlot", -- [152] + "AcceptAreaSpiritHeal", -- [154] + "AcceptBattlefieldPort", -- [155] + "CancelAreaSpiritHeal", -- [156] + "CanJoinBattlefieldAsGroup", -- [157] + "CheckSpiritHealerDist", -- [158] + "GetAreaSpiritHealerTime", -- [159] + "GetBattlefieldEstimatedWaitTime", -- [160] + "GetBattlefieldFlagPosition", -- [161] + "GetBattlefieldInstanceExpiration", -- [162] + "GetBattlefieldInstanceRunTime", -- [163] + "GetBattlefieldMapIconScale", -- [164] + "GetBattlefieldPortExpiration", -- [165] + "GetBattlefieldPosition", -- [166] + "GetBattlefieldScore", -- [167] + "GetBattlefieldStatData", -- [168] + "GetBattlefieldStatInfo", -- [169] + "GetBattlefieldStatus", -- [170] + "GetBattlefieldTimeWaited", -- [171] + "GetBattlefieldWinner", -- [172] + "GetBattlegroundInfo", -- [173] + "GetNumBattlefieldFlagPositions", -- [174] + "GetNumBattlefieldPositions", -- [175] + "GetNumBattlefieldScores", -- [176] + "GetNumBattlefieldStats", -- [177] + "GetNumWorldStateUI", -- [178] + "GetWintergraspWaitTime", -- [179] + "GetWorldStateUIInfo", -- [180] + "IsPVPTimerRunning", -- [181] + "JoinBattlefield", -- [182] + "LeaveBattlefield", -- [183] + "ReportPlayerIsPVPAFK", -- [184] + "RequestBattlefieldPositions", -- [185] + "RequestBattlefieldScoreData", -- [186] + "RequestBattlegroundInstanceInfo", -- [187] + "SetBattlefieldScoreFaction", -- [188] + "GetBinding", -- [190] + "GetBindingAction", -- [191] + "GetBindingKey", -- [192] + "GetBindingText", -- [193] + "GetCurrentBindingSet", -- [194] + "GetNumBindings", -- [195] + "LoadBindings", -- [196] + "RunBinding", -- [197] + "SaveBindings", -- [198] + "SetBinding", -- [199] + "SetBindingSpell", -- [200] + "SetBindingClick", -- [201] + "SetBindingItem", -- [202] + "SetBindingMacro", -- [203] + "SetConsoleKey", -- [204] + "SetOverrideBinding", -- [205] + "SetOverrideBindingSpell", -- [206] + "SetOverrideBindingClick", -- [207] + "SetOverrideBindingItem", -- [208] + "SetOverrideBindingMacro", -- [209] + "ClearOverrideBindings", -- [210] + "SetMouselookOverrideBinding", -- [211] + "IsModifierKeyDown", -- [212] + "IsModifiedClick", -- [213] + "IsMouseButtonDown", -- [214] + "CancelUnitBuff", -- [216] + "CancelShapeshiftForm", -- [217] + "CancelItemTempEnchantment", -- [218] + "GetWeaponEnchantInfo", -- [219] + "UnitAura", -- [220] + "UnitBuff", -- [221] + "UnitDebuff", -- [222] + "AddChatWindowChannel", -- [224] + "ChannelBan", -- [225] + "ChannelInvite", -- [226] + "ChannelKick", -- [227] + "ChannelModerator", -- [228] + "ChannelMute", -- [229] + "ChannelToggleAnnouncements", -- [230] + "ChannelUnban", -- [231] + "ChannelUnmoderator", -- [232] + "ChannelUnmute", -- [233] + "DisplayChannelOwner", -- [234] + "DeclineInvite", -- [235] + "EnumerateServerChannels", -- [236] + "GetChannelList", -- [237] + "GetChannelName", -- [238] + "GetChatWindowChannels", -- [239] + "JoinChannelByName", -- [240] + "LeaveChannelByName", -- [241] + "ListChannelByName", -- [242] + "ListChannels", -- [243] + "RemoveChatWindowChannel", -- [244] + "SendChatMessage", -- [245] + "SetChannelOwner", -- [246] + "SetChannelPassword", -- [247] + "AcceptResurrect", -- [249] + "AcceptXPLoss", -- [250] + "CheckBinderDist", -- [251] + "ConfirmBinder", -- [252] + "DeclineResurrect", -- [253] + "DestroyTotem", -- [254] + "GetBindLocation", -- [255] + "GetComboPoints", -- [256] + "GetCorpseRecoveryDelay", -- [257] + "GetCurrentTitle", -- [258] + "GetMirrorTimerInfo", -- [259] + "GetMirrorTimerProgress", -- [260] + "GetMoney", -- [261] + "GetNumTitles", -- [262] + "GetPlayerFacing", -- [263] + "GetPVPDesired", -- [264] + "GetReleaseTimeRemaining", -- [265] + "GetResSicknessDuration", -- [266] + "GetRestState", -- [267] + "GetRuneCooldown", -- [268] + "GetRuneCount", -- [269] + "GetRuneType", -- [270] + "GetTimeToWellRested", -- [271] + "GetTitleName", -- [272] + "GetUnitPitch", -- [273] + "GetXPExhaustion", -- [274] + "HasFullControl", -- [275] + "HasSoulstone", -- [276] + "IsFalling", -- [277] + "IsFlying", -- [278] + "IsFlyableArea", -- [279] + "IsIndoors", -- [280] + "IsMounted", -- [281] + "IsOutdoors", -- [282] + "IsOutOfBounds", -- [283] + "IsResting", -- [284] + "IsStealthed", -- [285] + "IsSwimming", -- [286] + "IsTitleKnown", -- [287] + "IsXPUserDisabled", -- [288] + "NotWhileDeadError", -- [289] + "ResurrectHasSickness", -- [290] + "ResurrectHasTimer", -- [291] + "ResurrectGetOfferer", -- [292] + "RetrieveCorpse", -- [293] + "SetCurrentTitle", -- [294] + "TargetTotem", -- [295] + "GetArmorPenetration", -- [296] + "GetAttackPowerForStat", -- [297] + "GetAverageItemLevel", -- [298] + "GetBlockChance", -- [299] + "GetCombatRating", -- [300] + "GetCombatRatingBonus", -- [301] + "GetCritChance", -- [302] + "GetCritChanceFromAgility", -- [303] + "GetDodgeChance", -- [304] + "GetExpertise", -- [305] + "GetExpertisePercent", -- [306] + "GetManaRegen", -- [307] + "GetMaxCombatRatingBonus", -- [308] + "GetParryChance", -- [309] + "GetPetSpellBonusDamage", -- [310] + "GetPowerRegen", -- [311] + "GetSpellBonusDamage", -- [312] + "GetRangedCritChance", -- [313] + "GetSpellBonusHealing", -- [314] + "GetSpellCritChance", -- [315] + "GetShieldBlock", -- [316] + "GetSpellCritChanceFromIntellect", -- [317] + "GetSpellPenetration", -- [318] + "AddChatWindowChannel", -- [319] + "ChangeChatColor", -- [320] + "ChatFrame_AddChannel", -- [321] + "ChatFrame_AddMessageEventFilter", -- [322] + "ChatFrame_GetMessageEventFilters", -- [323] + "ChatFrame_OnHyperlinkShow", -- [324] + "ChatFrame_RemoveMessageEventFilter", -- [325] + "GetAutoCompleteResults", -- [326] + "GetChatTypeIndex", -- [327] + "GetChatWindowChannels", -- [328] + "GetChatWindowInfo", -- [329] + "GetChatWindowMessages", -- [330] + "JoinChannelByName", -- [331] + "LoggingChat", -- [332] + "LoggingCombat", -- [333] + "RemoveChatWindowChannel", -- [334] + "RemoveChatWindowMessages", -- [335] + "SetChatWindowAlpha", -- [336] + "SetChatWindowColor", -- [337] + "SetChatWindowDocked", -- [338] + "SetChatWindowLocked", -- [339] + "SetChatWindowName", -- [340] + "SetChatWindowShown", -- [341] + "SetChatWindowSize", -- [342] + "SetChatWindowUninteractable", -- [343] + "DoEmote", -- [345] + "GetDefaultLanguage", -- [346] + "GetLanguageByIndex", -- [347] + "GetNumLanguages", -- [348] + "GetRegisteredAddonMessagePrefixes", -- [349] + "IsAddonMessagePrefixRegistered", -- [350] + "RegisterAddonMessagePrefix", -- [352] + "SendAddonMessage", -- [353] + "SendChatMessage", -- [354] + "CallCompanion", -- [356] + "DismissCompanion", -- [357] + "GetCompanionInfo", -- [358] + "GetNumCompanions", -- [359] + "GetCompanionCooldown", -- [360] + "PickupCompanion", -- [361] + "SummonRandomCritter", -- [362] + "ContainerIDToInventoryID", -- [364] + "GetBagName", -- [365] + "GetContainerItemCooldown", -- [366] + "GetContainerItemDurability", -- [367] + "GetContainerItemGems", -- [368] + "GetContainerItemID", -- [369] + "GetContainerItemInfo", -- [370] + "GetContainerItemLink", -- [371] + "GetContainerNumSlots", -- [372] + "GetContainerItemQuestInfo", -- [373] + "GetContainerNumFreeSlots", -- [374] + "OpenAllBags", -- [376] + "CloseAllBags", -- [377] + "PickupBagFromSlot", -- [378] + "PickupContainerItem", -- [379] + "PutItemInBackpack", -- [380] + "PutItemInBag", -- [381] + "PutKeyInKeyRing", -- [382] + "SplitContainerItem", -- [383] + "ToggleBackpack", -- [384] + "ToggleBag", -- [385] + "GetCoinText", -- [388] + "GetCoinTextureString", -- [389] + "GetCurrencyInfo", -- [390] + "GetCurrencyListSize", -- [391] + "GetCurrencyListInfo", -- [392] + "ExpandCurrencyList", -- [393] + "SetCurrencyUnused", -- [394] + "GetNumWatchedTokens", -- [395] + "GetBackpackCurrencyInfo", -- [396] + "SetCurrencyBackpack", -- [397] + "AutoEquipCursorItem", -- [399] + "ClearCursor", -- [400] + "CursorCanGoInSlot", -- [401] + "CursorHasItem", -- [402] + "CursorHasMoney", -- [403] + "CursorHasSpell", -- [404] + "DeleteCursorItem", -- [405] + "DropCursorMoney", -- [406] + "DropItemOnUnit", -- [407] + "EquipCursorItem", -- [408] + "GetCursorInfo", -- [409] + "GetCursorPosition", -- [410] + "HideRepairCursor", -- [411] + "InRepairMode", -- [412] + "PickupAction", -- [413] + "PickupBagFromSlot", -- [414] + "PickupContainerItem", -- [415] + "PickupInventoryItem", -- [416] + "PickupItem", -- [417] + "PickupMacro", -- [418] + "PickupMerchantItem", -- [419] + "PickupPetAction", -- [420] + "PickupSpell", -- [421] + "PickupStablePet", -- [422] + "PickupTradeMoney", -- [423] + "PlaceAction", -- [424] + "PutItemInBackpack", -- [425] + "PutItemInBag", -- [426] + "ResetCursor", -- [427] + "SetCursor", -- [428] + "ShowContainerSellCursor", -- [429] + "ShowInspectCursor", -- [430] + "ShowInventorySellCursor", -- [431] + "ShowMerchantSellCursor", -- [432] + "ShowRepairCursor", -- [433] + "SplitContainerItem", -- [434] + "GetWeaponEnchantInfo", -- [435] + "ReplaceEnchant", -- [436] + "ReplaceTradeEnchant", -- [437] + "BindEnchant", -- [438] + "CollapseFactionHeader", -- [439] + "CollapseAllFactionHeaders", -- [440] + "ExpandFactionHeader", -- [441] + "ExpandAllFactionHeaders", -- [442] + "FactionToggleAtWar", -- [443] + "GetFactionInfo", -- [444] + "GetNumFactions", -- [445] + "GetSelectedFaction", -- [446] + "GetWatchedFactionInfo", -- [447] + "IsFactionInactive", -- [448] + "SetFactionActive", -- [449] + "SetFactionInactive", -- [450] + "SetSelectedFaction", -- [451] + "SetWatchedFactionIndex", -- [452] + "UnitFactionGroup", -- [453] + "CreateFrame", -- [454] + "CreateFont", -- [455] + "GetFramesRegisteredForEvent", -- [456] + "GetNumFrames", -- [457] + "EnumerateFrames", -- [458] + "GetMouseFocus", -- [459] + "ToggleDropDownMenu", -- [460] + "UIFrameFadeIn", -- [461] + "UIFrameFadeOut", -- [462] + "UIFrameFlash", -- [463] + "EasyMenu", -- [464] + "AddFriend", -- [466] + "AddOrRemoveFriend", -- [467] + "GetFriendInfo", -- [468] + "SetFriendNotes", -- [469] + "GetNumFriends", -- [470] + "GetSelectedFriend", -- [471] + "RemoveFriend", -- [472] + "SetSelectedFriend", -- [473] + "ShowFriends", -- [474] + "ToggleFriendsFrame", -- [475] + "GetNumGlyphSockets", -- [477] + "GetGlyphSocketInfo", -- [478] + "GetGlyphLink", -- [479] + "GlyphMatchesSocket", -- [480] + "PlaceGlyphInSocket", -- [481] + "RemoveGlyphFromSocket", -- [482] + "SpellCanTargetGlyph", -- [483] + "CanComplainChat", -- [485] + "CanComplainInboxItem", -- [486] + "ComplainChat", -- [487] + "ComplainInboxItem", -- [488] + "CloseGossip", -- [501] + "ForceGossip", -- [502] + "GetGossipActiveQuests", -- [503] + "GetGossipAvailableQuests", -- [504] + "GetGossipOptions", -- [505] + "GetGossipText", -- [506] + "GetNumGossipActiveQuests", -- [507] + "GetNumGossipAvailableQuests", -- [508] + "GetNumGossipOptions", -- [509] + "SelectGossipActiveQuest", -- [510] + "SelectGossipAvailableQuest", -- [511] + "SelectGossipOption", -- [512] + "AcceptGroup", -- [514] + "ConfirmReadyCheck", -- [515] + "ConvertToRaid", -- [516] + "DeclineGroup", -- [517] + "DoReadyCheck", -- [518] + "GetLootMethod", -- [519] + "GetLootThreshold", -- [520] + "GetMasterLootCandidate", -- [521] + "GetNumPartyMembers", -- [522] + "GetRealNumPartyMembers", -- [523] + "GetPartyLeaderIndex", -- [524] + "GetPartyMember", -- [525] + "InviteUnit", -- [526] + "IsPartyLeader", -- [527] + "LeaveParty", -- [528] + "PromoteToLeader", -- [529] + "SetLootMethod", -- [530] + "SetLootThreshold", -- [531] + "UninviteUnit", -- [532] + "UnitInParty", -- [533] + "UnitIsPartyLeader", -- [534] + "AcceptGuild", -- [536] + "BuyGuildCharter", -- [537] + "CanEditGuildEvent", -- [538] + "CanEditGuildInfo", -- [539] + "CanEditMOTD", -- [540] + "CanEditOfficerNote", -- [541] + "CanEditPublicNote", -- [542] + "CanGuildDemote", -- [543] + "CanGuildInvite", -- [544] + "CanGuildPromote", -- [545] + "CanGuildRemove", -- [546] + "CanViewOfficerNote", -- [547] + "CloseGuildRegistrar", -- [548] + "CloseGuildRoster", -- [549] + "CloseTabardCreation", -- [550] + "DeclineGuild", -- [551] + "GetGuildCharterCost", -- [552] + "GetGuildEventInfo", -- [553] + "GetGuildInfo", -- [554] + "GetGuildInfoText", -- [555] + "GetGuildRosterInfo", -- [556] + "GetGuildRosterLastOnline", -- [557] + "GetGuildRosterMOTD", -- [558] + "GetGuildRosterSelection", -- [559] + "GetGuildRosterShowOffline", -- [560] + "GetNumGuildEvents", -- [561] + "GetNumGuildMembers", -- [562] + "GetTabardCreationCost", -- [563] + "GetTabardInfo", -- [564] + "GuildControlAddRank", -- [565] + "GuildControlDelRank", -- [566] + "GuildControlGetNumRanks", -- [567] + "GuildControlGetRankFlags", -- [568] + "GuildControlGetRankName", -- [569] + "GuildControlSaveRank", -- [570] + "GuildControlSetRank", -- [571] + "GuildControlSetRankFlag", -- [572] + "GuildDemote", -- [573] + "GuildDisband", -- [574] + "GuildInfo", -- [575] + "GuildInvite", -- [576] + "GuildLeave", -- [577] + "GuildPromote", -- [578] + "GuildRoster", -- [579] + "GuildRosterSetOfficerNote", -- [580] + "GuildRosterSetPublicNote", -- [581] + "GuildSetMOTD", -- [582] + "GuildSetLeader", -- [583] + "GuildUninvite", -- [584] + "IsGuildLeader", -- [585] + "IsInGuild", -- [586] + "QueryGuildEventLog", -- [587] + "SetGuildInfoText", -- [588] + "SetGuildRosterSelection", -- [589] + "SetGuildRosterShowOffline", -- [590] + "SortGuildRoster", -- [591] + "UnitGetGuildXP", -- [592] + "AutoStoreGuildBankItem", -- [593] + "BuyGuildBankTab", -- [594] + "CanGuildBankRepair", -- [595] + "CanWithdrawGuildBankMoney", -- [596] + "CloseGuildBankFrame", -- [597] + "DepositGuildBankMoney", -- [598] + "GetCurrentGuildBankTab", -- [599] + "GetGuildBankItemInfo", -- [600] + "GetGuildBankItemLink", -- [601] + "GetGuildBankMoney", -- [602] + "GetGuildBankMoneyTransaction", -- [603] + "GetGuildBankTabCost", -- [604] + "GetGuildBankTabInfo", -- [605] + "GetGuildBankTabPermissions", -- [606] + "GetGuildBankText", -- [607] + "GetGuildBankTransaction", -- [608] + "GetGuildTabardFileNames", -- [611] + "GetNumGuildBankMoneyTransactions", -- [612] + "GetNumGuildBankTabs", -- [613] + "GetNumGuildBankTransactions", -- [614] + "PickupGuildBankItem", -- [615] + "PickupGuildBankMoney", -- [616] + "QueryGuildBankLog", -- [617] + "QueryGuildBankTab", -- [618] + "SetCurrentGuildBankTab", -- [619] + "SetGuildBankTabInfo", -- [620] + "SetGuildBankTabPermissions", -- [621] + "SplitGuildBankItem", -- [624] + "WithdrawGuildBankMoney", -- [625] + "GetHolidayBGHonorCurrencyBonuses", -- [627] + "GetInspectHonorData", -- [628] + "GetPVPLifetimeStats", -- [629] + "GetPVPRankInfo", -- [630] + "GetPVPRankProgress", -- [631] + "GetPVPSessionStats", -- [632] + "GetPVPYesterdayStats", -- [633] + "GetRandomBGHonorCurrencyBonuses", -- [634] + "HasInspectHonorData", -- [635] + "RequestInspectHonorData", -- [636] + "UnitPVPName", -- [637] + "UnitPVPRank", -- [638] + "AddIgnore", -- [640] + "AddOrDelIgnore", -- [641] + "DelIgnore", -- [642] + "GetIgnoreName", -- [643] + "GetNumIgnores", -- [644] + "GetSelectedIgnore", -- [645] + "SetSelectedIgnore", -- [646] + "CanInspect", -- [648] + "CheckInteractDistance", -- [649] + "ClearInspectPlayer", -- [650] + "GetInspectArenaTeamData", -- [651] + "HasInspectHonorData", -- [652] + "RequestInspectHonorData", -- [653] + "GetInspectHonorData", -- [654] + "NotifyInspect", -- [655] + "InspectUnit", -- [656] + "CanShowResetInstances", -- [658] + "GetBattlefieldInstanceExpiration", -- [659] + "GetBattlefieldInstanceInfo", -- [660] + "GetBattlefieldInstanceRunTime", -- [661] + "GetInstanceBootTimeRemaining", -- [662] + "GetInstanceInfo", -- [663] + "GetNumSavedInstances", -- [664] + "GetSavedInstanceInfo", -- [665] + "IsInInstance", -- [666] + "ResetInstances", -- [667] + "GetDungeonDifficulty", -- [668] + "SetDungeonDifficulty", -- [669] + "GetInstanceDifficulty", -- [670] + "GetInstanceLockTimeRemaining", -- [671] + "GetInstanceLockTimeRemainingEncounter", -- [672] + "AutoEquipCursorItem", -- [674] + "BankButtonIDToInvSlotID", -- [675] + "CancelPendingEquip", -- [676] + "ConfirmBindOnUse", -- [677] + "ContainerIDToInventoryID", -- [678] + "CursorCanGoInSlot", -- [679] + "EquipCursorItem", -- [680] + "EquipPendingItem", -- [681] + "GetInventoryAlertStatus", -- [682] + "GetInventoryItemBroken", -- [683] + "GetInventoryItemCooldown", -- [684] + "GetInventoryItemCount", -- [685] + "GetInventoryItemDurability", -- [686] + "GetInventoryItemGems", -- [687] + "GetInventoryItemID", -- [688] + "GetInventoryItemLink", -- [689] + "GetInventoryItemQuality", -- [690] + "GetInventoryItemTexture", -- [691] + "GetInventorySlotInfo", -- [692] + "GetWeaponEnchantInfo", -- [693] + "HasWandEquipped", -- [694] + "IsInventoryItemLocked", -- [695] + "KeyRingButtonIDToInvSlotID", -- [696] + "PickupBagFromSlot", -- [697] + "PickupInventoryItem", -- [698] + "UpdateInventoryAlertStatus", -- [699] + "UseInventoryItem", -- [700] + "EquipItemByName", -- [702] + "GetAuctionItemLink", -- [703] + "GetContainerItemLink", -- [704] + "GetItemCooldown", -- [705] + "GetItemCount", -- [706] + "GetItemFamily", -- [707] + "GetItemIcon", -- [708] + "GetItemInfo", -- [709] + "GetItemQualityColor", -- [710] + "GetItemSpell", -- [711] + "GetItemStats", -- [712] + "GetMerchantItemLink", -- [713] + "GetQuestItemLink", -- [714] + "GetQuestLogItemLink", -- [715] + "GetTradePlayerItemLink", -- [716] + "GetTradeSkillItemLink", -- [717] + "GetTradeSkillReagentItemLink", -- [718] + "GetTradeTargetItemLink", -- [719] + "IsUsableItem", -- [720] + "IsConsumableItem", -- [721] + "IsCurrentItem", -- [722] + "IsEquippedItem", -- [723] + "IsEquippableItem", -- [724] + "IsEquippedItemType", -- [725] + "IsItemInRange", -- [726] + "ItemHasRange", -- [727] + "OffhandHasWeapon", -- [728] + "SplitContainerItem", -- [729] + "SetItemRef", -- [730] + "AcceptSockets", -- [731] + "ClickSocketButton", -- [732] + "CloseSocketInfo", -- [733] + "GetSocketItemInfo", -- [734] + "GetSocketItemRefundable", -- [735] + "GetSocketItemBoundTradeable", -- [736] + "GetNumSockets", -- [737] + "GetSocketTypes", -- [738] + "GetExistingSocketInfo", -- [739] + "GetExistingSocketLink", -- [740] + "GetNewSocketInfo", -- [741] + "GetNewSocketLink", -- [742] + "SocketInventoryItem", -- [743] + "SocketContainerItem", -- [744] + "CloseItemText", -- [745] + "ItemTextGetCreator", -- [746] + "ItemTextGetItem", -- [747] + "ItemTextGetMaterial", -- [748] + "ItemTextGetPage", -- [749] + "ItemTextGetText", -- [750] + "ItemTextHasNextPage", -- [751] + "ItemTextNextPage", -- [752] + "ItemTextPrevPage", -- [753] + "GetMinimapZoneText", -- [755] + "GetRealZoneText", -- [756] + "GetSubZoneText", -- [757] + "GetZonePVPInfo", -- [758] + "GetZoneText", -- [759] + "CompleteLFGRoleCheck", -- [760] + "GetLFGDeserterExpiration", -- [761] + "GetLFGRandomCooldownExpiration", -- [762] + "GetLFGBootProposal", -- [763] + "GetLFGMode", -- [764] + "GetLFGQueueStats", -- [765] + "GetLFGRoles", -- [766] + "GetLFGRoleUpdate", -- [767] + "GetLFGRoleUpdateSlot", -- [768] + "SetLFGBootVote", -- [769] + "SetLFGComment", -- [770] + "SetLFGRoles", -- [771] + "UninviteUnit", -- [772] + "UnitGroupRolesAssigned", -- [773] + "UnitHasLFGDeserter", -- [774] + "UnitHasLFGRandomCooldown", -- [775] + "CloseLoot", -- [777] + "ConfirmBindOnUse", -- [778] + "ConfirmLootRoll", -- [779] + "ConfirmLootSlot", -- [780] + "GetLootMethod", -- [781] + "GetLootRollItemInfo", -- [782] + "GetLootRollItemLink", -- [783] + "GetLootRollTimeLeft", -- [784] + "GetLootSlotInfo", -- [785] + "GetLootSlotLink", -- [786] + "GetLootThreshold", -- [787] + "GetMasterLootCandidate", -- [788] + "GetNumLootItems", -- [789] + "GetOptOutOfLoot", -- [790] + "GiveMasterLoot", -- [791] + "IsFishingLoot", -- [792] + "LootSlot", -- [793] + "LootSlotIsCoin", -- [794] + "LootSlotIsCurrency", -- [795] + "LootSlotIsItem", -- [796] + "RollOnLoot", -- [797] + "SetLootMethod", -- [798] + "SetLootPortrait", -- [799] + "SetLootThreshold", -- [800] + "SetOptOutOfLoot", -- [801] + "CursorHasMacro", -- [804] + "DeleteMacro", -- [805] + "GetMacroBody", -- [807] + "GetMacroIconInfo", -- [808] + "GetMacroItemIconInfo", -- [809] + "GetMacroIndexByName", -- [810] + "GetMacroInfo", -- [811] + "GetNumMacroIcons", -- [812] + "GetNumMacroItemIcons", -- [813] + "GetNumMacros", -- [814] + "PickupMacro", -- [815] + "RunMacro", -- [816] + "RunMacroText", -- [817] + "SecureCmdOptionParse", -- [818] + "StopMacro", -- [819] + "AutoLootMailItem", -- [821] + "CheckInbox", -- [822] + "ClearSendMail", -- [823] + "ClickSendMailItemButton", -- [824] + "CloseMail", -- [825] + "DeleteInboxItem", -- [826] + "GetCoinIcon", -- [827] + "GetInboxHeaderInfo", -- [828] + "GetInboxItem", -- [829] + "GetInboxItemLink", -- [830] + "GetInboxNumItems", -- [831] + "GetInboxText", -- [832] + "GetInboxInvoiceInfo", -- [833] + "GetNumPackages", -- [834] + "GetNumStationeries", -- [835] + "GetPackageInfo", -- [836] + "GetSelectedStationeryTexture", -- [837] + "GetSendMailCOD", -- [838] + "GetSendMailItem", -- [839] + "GetSendMailItemLink", -- [840] + "GetSendMailMoney", -- [841] + "GetSendMailPrice", -- [842] + "GetStationeryInfo", -- [843] + "HasNewMail", -- [844] + "InboxItemCanDelete", -- [845] + "ReturnInboxItem", -- [846] + "SelectPackage", -- [847] + "SelectStationery", -- [848] + "SendMail", -- [849] + "SetSendMailCOD", -- [850] + "SetSendMailMoney", -- [851] + "TakeInboxItem", -- [852] + "TakeInboxMoney", -- [853] + "TakeInboxTextItem", -- [854] + "ClickLandmark", -- [856] + "GetCorpseMapPosition", -- [857] + "GetCurrentMapContinent", -- [858] + "GetCurrentMapDungeonLevel", -- [859] + "GetNumDungeonMapLevels", -- [860] + "GetCurrentMapAreaID", -- [861] + "GetCurrentMapZone", -- [862] + "GetMapContinents", -- [863] + "GetMapDebugObjectInfo", -- [864] + "GetMapInfo", -- [865] + "GetMapLandmarkInfo", -- [866] + "GetMapOverlayInfo", -- [867] + "GetMapZones", -- [868] + "GetNumMapDebugObjects", -- [869] + "GetNumMapLandmarks", -- [870] + "GetNumMapOverlays", -- [871] + "GetPlayerMapPosition", -- [872] + "ProcessMapClick", -- [873] + "RequestBattlefieldPositions", -- [874] + "SetDungeonMapLevel", -- [875] + "SetMapByID", -- [876] + "SetMapToCurrentZone", -- [877] + "SetMapZoom", -- [878] + "SetupFullscreenScale", -- [879] + "UpdateMapHighlight", -- [880] + "CreateWorldMapArrowFrame", -- [881] + "UpdateWorldMapArrowFrames", -- [882] + "ShowWorldMapArrowFrame", -- [883] + "PositionWorldMapArrowFrame", -- [884] + "ZoomOut", -- [885] + "BuyMerchantItem", -- [887] + "BuybackItem", -- [888] + "CanMerchantRepair", -- [889] + "CloseMerchant", -- [890] + "GetBuybackItemInfo", -- [891] + "GetBuybackItemLink", -- [892] + "GetMerchantItemCostInfo", -- [893] + "GetMerchantItemCostItem", -- [894] + "GetMerchantItemInfo", -- [895] + "GetMerchantItemLink", -- [896] + "GetMerchantItemMaxStack", -- [897] + "GetMerchantNumItems", -- [898] + "GetRepairAllCost", -- [899] + "HideRepairCursor", -- [900] + "InRepairMode", -- [901] + "PickupMerchantItem", -- [902] + "RepairAllItems", -- [903] + "ShowMerchantSellCursor", -- [904] + "ShowRepairCursor", -- [905] + "GetNumBuybackItems", -- [906] + "CastPetAction", -- [908] + "ClosePetStables", -- [909] + "DropItemOnUnit", -- [910] + "GetPetActionCooldown", -- [911] + "GetPetActionInfo", -- [912] + "GetPetActionSlotUsable", -- [913] + "GetPetActionsUsable", -- [914] + "GetPetExperience", -- [915] + "GetPetFoodTypes", -- [916] + "GetPetHappiness", -- [917] + "GetPetIcon", -- [918] + "GetPetTimeRemaining", -- [919] + "GetStablePetFoodTypes", -- [920] + "GetStablePetInfo", -- [921] + "HasPetSpells", -- [922] + "HasPetUI", -- [923] + "PetAbandon", -- [924] + "PetAggressiveMode", -- [925] + "PetAttack", -- [926] + "IsPetAttackActive", -- [927] + "PetStopAttack", -- [928] + "PetCanBeAbandoned", -- [929] + "PetCanBeDismissed", -- [930] + "PetCanBeRenamed", -- [931] + "PetDefensiveMode", -- [932] + "PetDismiss", -- [933] + "PetFollow", -- [934] + "PetHasActionBar", -- [935] + "PetPassiveMode", -- [936] + "PetRename", -- [937] + "PetWait", -- [938] + "PickupPetAction", -- [939] + "PickupStablePet", -- [940] + "SetPetStablePaperdoll", -- [941] + "TogglePetAutocast", -- [942] + "ToggleSpellAutocast", -- [943] + "GetSpellAutocast", -- [944] + "AddQuestWatch", -- [946] + "GetActiveLevel", -- [947] + "GetActiveTitle", -- [948] + "GetAvailableLevel", -- [949] + "GetAvailableTitle", -- [950] + "GetAvailableQuestInfo", -- [951] + "GetGreetingText", -- [952] + "GetNumQuestLeaderBoards", -- [953] + "GetNumQuestWatches", -- [954] + "GetObjectiveText", -- [955] + "GetProgressText", -- [956] + "GetQuestGreenRange", -- [957] + "GetQuestIndexForWatch", -- [958] + "GetQuestLink", -- [959] + "GetQuestLogGroupNum", -- [960] + "GetQuestLogLeaderBoard", -- [961] + "GetQuestLogTitle", -- [962] + "GetQuestReward", -- [963] + "GetRewardArenaPoints", -- [964] + "GetRewardHonor", -- [965] + "GetRewardMoney", -- [966] + "GetRewardSpell", -- [967] + "GetRewardTalents", -- [968] + "GetRewardText", -- [969] + "GetRewardTitle", -- [970] + "GetRewardXP", -- [971] + "IsQuestWatched", -- [972] + "IsUnitOnQuest", -- [973] + "QuestFlagsPVP", -- [974] + "QuestGetAutoAccept", -- [975] + "RemoveQuestWatch", -- [976] + "ShiftQuestWatches", -- [977] + "SortQuestWatches", -- [978] + "QueryQuestsCompleted", -- [979] + "GetQuestsCompleted", -- [980] + "QuestIsDaily", -- [981] + "QuestIsWeekly", -- [982] + "ClearRaidMarker", -- [984] + "ConvertToRaid", -- [985] + "ConvertToParty", -- [986] + "DemoteAssistant", -- [987] + "GetAllowLowLevelRaid", -- [988] + "GetNumRaidMembers", -- [989] + "GetRealNumRaidMembers", -- [990] + "GetPartyAssignment", -- [991] + "GetPartyAssignment", -- [992] + "GetRaidRosterInfo", -- [993] + "GetRaidTargetIndex", -- [994] + "GetReadyCheckStatus", -- [995] + "InitiateRolePoll", -- [996] + "IsRaidLeader", -- [997] + "IsRaidOfficer", -- [998] + "PlaceRaidMarker", -- [999] + "PromoteToAssistant", -- [1000] + "RequestRaidInfo", -- [1001] + "SetPartyAssignment", -- [1002] + "SetAllowLowLevelRaid", -- [1003] + "SetRaidRosterSelection", -- [1004] + "SetRaidSubgroup", -- [1005] + "SwapRaidSubgroup", -- [1006] + "SetRaidTarget", -- [1007] + "UnitInRaid", -- [1008] + "LFGGetDungeonInfoByID", -- [1009] + "GetInstanceLockTimeRemainingEncounter", -- [1010] + "RefreshLFGList", -- [1011] + "SearchLFGGetEncounterResults", -- [1012] + "SearchLFGGetJoinedID", -- [1013] + "SearchLFGGetNumResults", -- [1014] + "SearchLFGGetPartyResults", -- [1015] + "SearchLFGGetResults", -- [1016] + "SearchLFGJoin", -- [1017] + "SearchLFGLeave", -- [1018] + "SearchLFGSort", -- [1019] + "SetLFGComment", -- [1020] + "ClearAllLFGDungeons", -- [1021] + "JoinLFG", -- [1022] + "LeaveLFG", -- [1023] + "RequestLFDPartyLockInfo", -- [1024] + "RequestLFDPlayerLockInfo", -- [1025] + "SetLFGDungeon", -- [1026] + "SetLFGDungeonEnabled", -- [1027] + "SetLFGHeaderCollapsed", -- [1028] + "GetAddOnCPUUsage", -- [1029] + "GetAddOnMemoryUsage", -- [1030] + "GetEventCPUUsage", -- [1031] + "GetFrameCPUUsage", -- [1032] + "GetFunctionCPUUsage", -- [1033] + "GetScriptCPUUsage", -- [1034] + "ResetCPUUsage", -- [1035] + "UpdateAddOnCPUUsage", -- [1036] + "UpdateAddOnMemoryUsage", -- [1037] + "issecure", -- [1038] + "forceinsecure", -- [1039] + "issecurevariable", -- [1040] + "securecall", -- [1041] + "hooksecurefunc", -- [1042] + "InCombatLockdown", -- [1043] + "CombatTextSetActiveUnit", -- [1046] + "DownloadSettings", -- [1047] + "GetCVar", -- [1048] + "GetCVarDefault", -- [1049] + "GetCVarBool", -- [1050] + "GetCVarInfo", -- [1051] + "GetCurrentMultisampleFormat", -- [1052] + "GetCurrentResolution", -- [1053] + "GetGamma", -- [1054] + "GetMultisampleFormats", -- [1055] + "GetRefreshRates", -- [1056] + "GetScreenResolutions", -- [1057] + "GetVideoCaps", -- [1058] + "IsThreatWarningEnabled", -- [1059] + "RegisterCVar", -- [1060] + "ResetPerformanceValues", -- [1061] + "ResetTutorials", -- [1062] + "SetCVar", -- [1063] + "SetEuropeanNumbers", -- [1064] + "SetGamma", -- [1065] + "SetLayoutMode", -- [1066] + "SetMultisampleFormat", -- [1067] + "SetScreenResolution", -- [1068] + "ShowCloak", -- [1069] + "ShowHelm", -- [1070] + "ShowNumericThreat", -- [1071] + "ShowingCloak", -- [1072] + "ShowingHelm", -- [1073] + "UploadSettings", -- [1074] + "AbandonSkill", -- [1076] + "CastShapeshiftForm", -- [1078] + "CastSpell", -- [1079] + "CastSpellByName", -- [1080] + "GetMultiCastTotemSpells", -- [1081] + "GetNumShapeshiftForms", -- [1082] + "GetNumSpellTabs", -- [1083] + "GetShapeshiftForm", -- [1084] + "GetShapeshiftFormCooldown", -- [1085] + "GetShapeshiftFormInfo", -- [1086] + "GetSpellAutocast", -- [1087] + "GetSpellBookItemInfo", -- [1088] + "GetSpellBookItemName", -- [1089] + "GetSpellCooldown", -- [1090] + "GetSpellDescription", -- [1091] + "GetSpellInfo", -- [1092] + "GetSpellLink", -- [1093] + "GetSpellTabInfo", -- [1094] + "GetSpellTexture", -- [1095] + "GetTotemInfo", -- [1096] + "IsAttackSpell", -- [1097] + "IsAutoRepeatSpell", -- [1098] + "IsPassiveSpell", -- [1099] + "IsSpellInRange", -- [1100] + "IsUsableSpell", -- [1101] + "PickupSpell", -- [1102] + "QueryCastSequence", -- [1103] + "SetMultiCastSpell", -- [1104] + "SpellCanTargetUnit", -- [1105] + "SpellHasRange", -- [1106] + "SpellIsTargeting", -- [1107] + "SpellStopCasting", -- [1108] + "SpellStopTargeting", -- [1109] + "SpellTargetUnit", -- [1110] + "ToggleSpellAutocast", -- [1111] + "UnitCastingInfo", -- [1112] + "UnitChannelInfo", -- [1113] + "ConsoleExec", -- [1115] + "DetectWowMouse", -- [1116] + "GetBuildInfo", -- [1117] + "geterrorhandler", -- [1118] + "GetCurrentKeyBoardFocus", -- [1119] + "GetExistingLocales", -- [1120] + "GetFramerate", -- [1121] + "GetGameTime", -- [1122] + "GetLocale", -- [1123] + "GetCursorPosition", -- [1124] + "GetNetStats", -- [1125] + "GetRealmName", -- [1126] + "GetScreenHeight", -- [1127] + "GetScreenWidth", -- [1128] + "GetText", -- [1129] + "GetTime", -- [1130] + "IsAltKeyDown", -- [1131] + "InCinematic", -- [1132] + "IsControlKeyDown", -- [1133] + "IsDebugBuild", -- [1134] + "IsDesaturateSupported", -- [1135] + "IsLeftAltKeyDown", -- [1136] + "IsLeftControlKeyDown", -- [1137] + "IsLeftShiftKeyDown", -- [1138] + "IsLinuxClient", -- [1139] + "IsLoggedIn", -- [1140] + "IsMacClient", -- [1141] + "IsRightAltKeyDown", -- [1142] + "IsRightControlKeyDown", -- [1143] + "IsRightShiftKeyDown", -- [1144] + "IsShiftKeyDown", -- [1145] + "IsStereoVideoAvailable", -- [1146] + "IsWindowsClient", -- [1147] + "OpeningCinematic", -- [1148] + "PlayMusic", -- [1149] + "PlaySound", -- [1150] + "PlaySoundFile", -- [1151] + "ReloadUI", -- [1152] + "RepopMe", -- [1153] + "RequestTimePlayed", -- [1154] + "RestartGx", -- [1155] + "RunScript", -- [1156] + "Screenshot", -- [1157] + "SetAutoDeclineGuildInvites", -- [1158] + "seterrorhandler", -- [1159] + "StopCinematic", -- [1160] + "StopMusic", -- [1161] + "UIParentLoadAddOn", -- [1162] + "TakeScreenshot", -- [1163] + "BuyTrainerService", -- [1168] + "CheckTalentMasterDist", -- [1169] + "ConfirmTalentWipe", -- [1170] + "GetActiveTalentGroup", -- [1171] + "GetNumTalentTabs", -- [1172] + "GetNumTalents", -- [1173] + "GetTalentInfo", -- [1174] + "GetTalentLink", -- [1175] + "GetTalentPrereqs", -- [1176] + "GetTalentTabInfo", -- [1177] + "LearnTalent", -- [1178] + "SetActiveTalentGroup", -- [1179] + "GetNumTalentGroups", -- [1180] + "GetActiveTalentGroup", -- [1181] + "AddPreviewTalentPoints", -- [1182] + "GetGroupPreviewTalentPointsSpent", -- [1183] + "GetPreviewTalentPointsSpent", -- [1184] + "GetUnspentTalentPoints", -- [1185] + "LearnPreviewTalents", -- [1186] + "ResetGroupPreviewTalentPoints", -- [1187] + "ResetPreviewTalentPoints", -- [1188] + "AssistUnit", -- [1190] + "AttackTarget", -- [1191] + "ClearTarget", -- [1192] + "ClickTargetTradeButton", -- [1193] + "TargetLastEnemy", -- [1194] + "TargetLastTarget", -- [1195] + "TargetNearestEnemy", -- [1196] + "TargetNearestEnemyPlayer", -- [1197] + "TargetNearestFriend", -- [1198] + "TargetNearestFriendPlayer", -- [1199] + "TargetNearestPartyMember", -- [1200] + "TargetNearestRaidMember", -- [1201] + "TargetUnit", -- [1202] + "ToggleBackpack", -- [1204] + "ToggleBag", -- [1205] + "ToggleCharacter", -- [1206] + "ToggleFriendsFrame", -- [1207] + "ToggleSpellBook", -- [1208] + "TradeSkill", -- [1209] + "CloseTradeSkill", -- [1210] + "CollapseTradeSkillSubClass", -- [1211] + "PickupPlayerMoney", -- [1212] + "PickupTradeMoney", -- [1213] + "SetTradeMoney", -- [1214] + "ReplaceTradeEnchant", -- [1215] + "AssistUnit", -- [1217] + "CheckInteractDistance", -- [1218] + "DropItemOnUnit", -- [1219] + "FollowUnit", -- [1220] + "FocusUnit", -- [1221] + "ClearFocus", -- [1222] + "GetUnitName", -- [1223] + "GetUnitPitch", -- [1224] + "GetUnitSpeed", -- [1225] + "InviteUnit", -- [1226] + "IsUnitOnQuest", -- [1227] + "SpellCanTargetUnit", -- [1228] + "SpellTargetUnit", -- [1229] + "TargetUnit", -- [1230] + "UnitAffectingCombat", -- [1231] + "UnitArmor", -- [1232] + "UnitAttackBothHands", -- [1233] + "UnitAttackPower", -- [1234] + "UnitAttackSpeed", -- [1235] + "UnitAura", -- [1236] + "UnitBuff", -- [1237] + "UnitCanAssist", -- [1238] + "UnitCanAttack", -- [1239] + "UnitCanCooperate", -- [1240] + "UnitClass", -- [1241] + "UnitClassification", -- [1242] + "UnitCreatureFamily", -- [1243] + "UnitCreatureType", -- [1244] + "UnitDamage", -- [1245] + "UnitDebuff", -- [1246] + "UnitDefense", -- [1247] + "UnitDetailedThreatSituation", -- [1248] + "UnitExists", -- [1249] + "UnitFactionGroup", -- [1250] + "UnitGroupRolesAssigned", -- [1251] + "UnitGUID", -- [1252] + "GetPlayerInfoByGUID", -- [1253] + "UnitHasLFGDeserter", -- [1254] + "UnitHasLFGRandomCooldown", -- [1255] + "UnitHasRelicSlot", -- [1256] + "UnitHealth", -- [1257] + "UnitHealthMax", -- [1258] + "UnitInParty", -- [1259] + "UnitInRaid", -- [1260] + "UnitInBattleground", -- [1261] + "UnitIsInMyGuild", -- [1262] + "UnitInRange", -- [1263] + "UnitIsAFK", -- [1264] + "UnitIsCharmed", -- [1265] + "UnitIsConnected", -- [1266] + "UnitIsCorpse", -- [1267] + "UnitIsDead", -- [1268] + "UnitIsDeadOrGhost", -- [1269] + "UnitIsDND", -- [1270] + "UnitIsEnemy", -- [1271] + "UnitIsFeignDeath", -- [1272] + "UnitIsFriend", -- [1273] + "UnitIsGhost", -- [1274] + "UnitIsPVP", -- [1275] + "UnitIsPVPFreeForAll", -- [1276] + "UnitIsPVPSanctuary", -- [1277] + "UnitIsPartyLeader", -- [1278] + "UnitIsPlayer", -- [1279] + "UnitIsPossessed", -- [1280] + "UnitIsRaidOfficer", -- [1281] + "UnitIsSameServer", -- [1282] + "UnitIsTapped", -- [1283] + "UnitIsTappedByPlayer", -- [1284] + "UnitIsTappedByAllThreatList", -- [1285] + "UnitIsTrivial", -- [1286] + "UnitIsUnit", -- [1287] + "UnitIsVisible", -- [1288] + "UnitLevel", -- [1289] + "UnitMana", -- [1290] + "UnitManaMax", -- [1291] + "UnitName", -- [1292] + "UnitOnTaxi", -- [1293] + "UnitPlayerControlled", -- [1294] + "UnitPlayerOrPetInParty", -- [1295] + "UnitPlayerOrPetInRaid", -- [1296] + "UnitPVPName", -- [1297] + "UnitPVPRank", -- [1298] + "UnitPower", -- [1299] + "UnitPowerMax", -- [1300] + "UnitPowerType", -- [1301] + "UnitRace", -- [1302] + "UnitRangedAttack", -- [1303] + "UnitRangedAttackPower", -- [1304] + "UnitRangedDamage", -- [1305] + "UnitReaction", -- [1306] + "UnitResistance", -- [1307] + "UnitSelectionColor", -- [1308] + "UnitSex", -- [1309] + "UnitStat", -- [1310] + "UnitThreatSituation", -- [1311] + "UnitUsingVehicle", -- [1312] + "GetThreatStatusColor", -- [1313] + "UnitXP", -- [1314] + "UnitXPMax", -- [1315] + "SetPortraitTexture", -- [1316] + "SetPortraitToTexture", -- [1317] + "tinsert", -- [1318] +} + +-- endp
--- a/Libs/DF/textentry.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/textentry.xml Fri Jul 20 19:04:12 2018 -0300 @@ -59,4 +59,4 @@ </EditBox> </ScrollChild> </ScrollFrame> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/DF/tutorial_alert.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/DF/tutorial_alert.xml Fri Jul 20 19:04:12 2018 -0300 @@ -244,4 +244,4 @@ </Frame> </Frames> </Frame> -</Ui> \ No newline at end of file +</Ui>
--- a/Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua Fri Jul 20 19:04:12 2018 -0300 @@ -1,39 +1,12 @@ ---[[ -Name: DBIcon-1.0 -Revision: $Rev: 34 $ -Author(s): Rabbit (rabbit.magtheridon@gmail.com) -Description: Allows addons to register to recieve a lightweight minimap icon as an alternative to more heavy LDB displays. -Dependencies: LibStub -License: GPL v2 or later. -]] - ---[[ -Copyright (C) 2008-2011 Rabbit - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -]] ----------------------------------------------------------------------- --- DBIcon-1.0 +-- LibDBIcon-1.0 -- --- Disclaimer: Most of this code was ripped from Barrel but fixed, streamlined --- and cleaned up a lot so that it no longer sucks. +-- Allows addons to easily create a lightweight minimap icon as an alternative to heavier LDB displays. -- local DBICON10 = "LibDBIcon-1.0" -local DBICON10_MINOR = tonumber(("$Rev: 34 $"):match("(%d+)")) +local DBICON10_MINOR = 36 -- Bump on changes if not LibStub then error(DBICON10 .. " requires LibStub.") end local ldb = LibStub("LibDataBroker-1.1", true) if not ldb then error(DBICON10 .. " requires LibDataBroker-1.1.") end @@ -45,8 +18,9 @@ lib.callbackRegistered = lib.callbackRegistered or nil lib.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib) lib.notCreated = lib.notCreated or {} +lib.tooltip = lib.tooltip or CreateFrame("GameTooltip", "LibDBIconTooltip", UIParent, "GameTooltipTemplate") -function lib:IconCallback(event, name, key, value, dataobj) +function lib:IconCallback(event, name, key, value) if lib.objects[name] then if key == "icon" then lib.objects[name].icon:SetTexture(value) @@ -73,7 +47,6 @@ lib.callbackRegistered = true end --- Tooltip code ripped from StatBlockCore by Funkydude local function getAnchors(frame) local x, y = frame:GetCenter() if not x or not y then return "CENTER" end @@ -86,10 +59,10 @@ if self.isMoving then return end local obj = self.dataObject if obj.OnTooltipShow then - GameTooltip:SetOwner(self, "ANCHOR_NONE") - GameTooltip:SetPoint(getAnchors(self)) - obj.OnTooltipShow(GameTooltip) - GameTooltip:Show() + lib.tooltip:SetOwner(self, "ANCHOR_NONE") + lib.tooltip:SetPoint(getAnchors(self)) + obj.OnTooltipShow(lib.tooltip) + lib.tooltip:Show() elseif obj.OnEnter then obj.OnEnter(self) end @@ -97,13 +70,13 @@ local function onLeave(self) local obj = self.dataObject - GameTooltip:Hide() + lib.tooltip:Hide() if obj.OnLeave then obj.OnLeave(self) end end -------------------------------------------------------------------------------- -local onClick, onMouseUp, onMouseDown, onDragStart, onDragStop, onDragEnd, updatePosition +local onClick, onMouseUp, onMouseDown, onDragStart, onDragStop, updatePosition do local minimapShapes = { @@ -165,7 +138,7 @@ self.icon:UpdateCoord() self:SetScript("OnUpdate", onUpdate) self.isMoving = true - GameTooltip:Hide() + lib.tooltip:Hide() end end @@ -197,14 +170,14 @@ button:SetFrameLevel(8) button:RegisterForClicks("anyUp") button:RegisterForDrag("LeftButton") - button:SetHighlightTexture("Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight") + button:SetHighlightTexture(136477) --"Interface\\Minimap\\UI-Minimap-ZoomButton-Highlight" local overlay = button:CreateTexture(nil, "OVERLAY") overlay:SetSize(53, 53) - overlay:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder") + overlay:SetTexture(136430) --"Interface\\Minimap\\MiniMap-TrackingBorder" overlay:SetPoint("TOPLEFT") local background = button:CreateTexture(nil, "BACKGROUND") background:SetSize(20, 20) - background:SetTexture("Interface\\Minimap\\UI-Minimap-Background") + background:SetTexture(136467) --"Interface\\Minimap\\UI-Minimap-Background" background:SetPoint("TOPLEFT", 7, -5) local icon = button:CreateTexture(nil, "ARTWORK") icon:SetSize(17, 17)
--- a/Libs/LibDataBroker-1.1/LibDataBroker-1.1.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/LibDataBroker-1.1/LibDataBroker-1.1.lua Fri Jul 20 19:04:12 2018 -0300 @@ -2,7 +2,7 @@ assert(LibStub, "LibDataBroker-1.1 requires LibStub") assert(LibStub:GetLibrary("CallbackHandler-1.0", true), "LibDataBroker-1.1 requires CallbackHandler-1.0") -local lib, oldminor = LibStub:NewLibrary("LibDataBroker-1.1", 3) +local lib, oldminor = LibStub:NewLibrary("LibDataBroker-1.1", 4) if not lib then return end oldminor = oldminor or 0 @@ -64,3 +64,27 @@ return self.namestorage[dataobject] end end + +if oldminor < 4 then + local next = pairs(attributestorage) + function lib:pairs(dataobject_or_name) + local t = type(dataobject_or_name) + assert(t == "string" or t == "table", "Usage: ldb:pairs('dataobjectname') or ldb:pairs(dataobject)") + + local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name + assert(attributestorage[dataobj], "Data object not found") + + return next, attributestorage[dataobj], nil + end + + local ipairs_iter = ipairs(attributestorage) + function lib:ipairs(dataobject_or_name) + local t = type(dataobject_or_name) + assert(t == "string" or t == "table", "Usage: ldb:ipairs('dataobjectname') or ldb:ipairs(dataobject)") + + local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name + assert(attributestorage[dataobj], "Data object not found") + + return ipairs_iter, attributestorage[dataobj], 0 + end +end
--- a/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua Fri Jul 20 19:04:12 2018 -0300 @@ -1,6 +1,6 @@ --[[ Name: LibSharedMedia-3.0 -Revision: $Revision: 69 $ +Revision: $Revision: 91 $ Author: Elkano (elkano@gmx.de) Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com) Website: http://www.wowace.com/projects/libsharedmedia-3-0/ @@ -9,7 +9,7 @@ License: LGPL v2.1 ]] -local MAJOR, MINOR = "LibSharedMedia-3.0", 4030402 -- increase manualy on changes +local MAJOR, MINOR = "LibSharedMedia-3.0", 6010002 -- 6.1.0 v2 / increase manually on changes local lib = LibStub:NewLibrary(MAJOR, MINOR) if not lib then return end @@ -60,9 +60,13 @@ -- BACKGROUND if not lib.MediaTable.background then lib.MediaTable.background = {} end lib.MediaTable.background["None"] = [[]] +lib.MediaTable.background["Blizzard Collections Background"] = [[Interface\Collections\CollectionsBackgroundTile]] lib.MediaTable.background["Blizzard Dialog Background"] = [[Interface\DialogFrame\UI-DialogBox-Background]] lib.MediaTable.background["Blizzard Dialog Background Dark"] = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]] lib.MediaTable.background["Blizzard Dialog Background Gold"] = [[Interface\DialogFrame\UI-DialogBox-Gold-Background]] +lib.MediaTable.background["Blizzard Garrison Background"] = [[Interface\Garrison\GarrisonUIBackground]] +lib.MediaTable.background["Blizzard Garrison Background 2"] = [[Interface\Garrison\GarrisonUIBackground2]] +lib.MediaTable.background["Blizzard Garrison Background 3"] = [[Interface\Garrison\GarrisonMissionUIInfoBoxBackgroundTile]] lib.MediaTable.background["Blizzard Low Health"] = [[Interface\FullScreenTextures\LowHealth]] lib.MediaTable.background["Blizzard Marble"] = [[Interface\FrameGeneral\UI-Background-Marble]] lib.MediaTable.background["Blizzard Out of Control"] = [[Interface\FullScreenTextures\OutOfControl]] @@ -88,6 +92,36 @@ -- FONT if not lib.MediaTable.font then lib.MediaTable.font = {} end local SML_MT_font = lib.MediaTable.font +--[[ +All font files are currently in all clients, the following table depicts which font supports which charset as of 5.0.4 +Fonts were checked using langcover.pl from DejaVu fonts (http://sourceforge.net/projects/dejavu/) and FontForge (http://fontforge.org/) +latin means check for: de, en, es, fr, it, pt + +file name latin koKR ruRU zhCN zhTW +2002.ttf 2002 X X X - - +2002B.ttf 2002 Bold X X X - - +ARHei.ttf AR CrystalzcuheiGBK Demibold X - X X X +ARIALN.TTF Arial Narrow X - X - - +ARKai_C.ttf AR ZhongkaiGBK Medium (Combat) X - X X X +ARKai_T.ttf AR ZhongkaiGBK Medium X - X X X +bHEI00M.ttf AR Heiti2 Medium B5 - - - - X +bHEI01B.ttf AR Heiti2 Bold B5 - - - - X +bKAI00M.ttf AR Kaiti Medium B5 - - - - X +bLEI00D.ttf AR Leisu Demi B5 - - - - X +FRIZQT__.TTF Friz Quadrata TT X - - - - +FRIZQT___CYR.TTF FrizQuadrataCTT x - X - - +K_Damage.TTF YDIWingsM - X X - - +K_Pagetext.TTF MoK X X X - - +MORPHEUS.TTF Morpheus X - - - - +MORPHEUS_CYR.TTF Morpheus X - X - - +NIM_____.ttf Nimrod MT X - X - - +SKURRI.TTF Skurri X - - - - +SKURRI_CYR.TTF Skurri X - X - - + +WARNING: Although FRIZQT___CYR is available on western clients, it doesn't support special European characters e.g. é, ï, ö +Due to this, we cannot use it as a replacement for FRIZQT__.TTF +]] + if locale == "koKR" then LOCALE_MASK = lib.LOCALE_BIT_koKR -- @@ -120,11 +154,17 @@ elseif locale == "ruRU" then LOCALE_MASK = lib.LOCALE_BIT_ruRU -- - SML_MT_font["Arial Narrow"] = [[Fonts\ARIALN.TTF]] - SML_MT_font["Friz Quadrata TT"] = [[Fonts\FRIZQT__.TTF]] - SML_MT_font["Morpheus"] = [[Fonts\MORPHEUS.TTF]] - SML_MT_font["Nimrod MT"] = [[Fonts\NIM_____.ttf]] - SML_MT_font["Skurri"] = [[Fonts\SKURRI.TTF]] + SML_MT_font["2002"] = [[Fonts\2002.TTF]] + SML_MT_font["2002 Bold"] = [[Fonts\2002B.TTF]] + SML_MT_font["AR CrystalzcuheiGBK Demibold"] = [[Fonts\ARHei.TTF]] + SML_MT_font["AR ZhongkaiGBK Medium (Combat)"] = [[Fonts\ARKai_C.TTF]] + SML_MT_font["AR ZhongkaiGBK Medium"] = [[Fonts\ARKai_T.TTF]] + SML_MT_font["Arial Narrow"] = [[Fonts\ARIALN.TTF]] + SML_MT_font["Friz Quadrata TT"] = [[Fonts\FRIZQT___CYR.TTF]] + SML_MT_font["MoK"] = [[Fonts\K_Pagetext.TTF]] + SML_MT_font["Morpheus"] = [[Fonts\MORPHEUS_CYR.TTF]] + SML_MT_font["Nimrod MT"] = [[Fonts\NIM_____.ttf]] + SML_MT_font["Skurri"] = [[Fonts\SKURRI_CYR.TTF]] -- lib.DefaultMedia.font = "Friz Quadrata TT" -- @@ -132,10 +172,17 @@ LOCALE_MASK = lib.LOCALE_BIT_western locale_is_western = true -- - SML_MT_font["Arial Narrow"] = [[Fonts\ARIALN.TTF]] - SML_MT_font["Friz Quadrata TT"] = [[Fonts\FRIZQT__.TTF]] - SML_MT_font["Morpheus"] = [[Fonts\MORPHEUS.TTF]] - SML_MT_font["Skurri"] = [[Fonts\SKURRI.TTF]] + SML_MT_font["2002"] = [[Fonts\2002.TTF]] + SML_MT_font["2002 Bold"] = [[Fonts\2002B.TTF]] + SML_MT_font["AR CrystalzcuheiGBK Demibold"] = [[Fonts\ARHei.TTF]] + SML_MT_font["AR ZhongkaiGBK Medium (Combat)"] = [[Fonts\ARKai_C.TTF]] + SML_MT_font["AR ZhongkaiGBK Medium"] = [[Fonts\ARKai_T.TTF]] + SML_MT_font["Arial Narrow"] = [[Fonts\ARIALN.TTF]] + SML_MT_font["Friz Quadrata TT"] = [[Fonts\FRIZQT__.TTF]] + SML_MT_font["MoK"] = [[Fonts\K_Pagetext.TTF]] + SML_MT_font["Morpheus"] = [[Fonts\MORPHEUS_CYR.TTF]] + SML_MT_font["Nimrod MT"] = [[Fonts\NIM_____.ttf]] + SML_MT_font["Skurri"] = [[Fonts\SKURRI_CYR.TTF]] -- lib.DefaultMedia.font = "Friz Quadrata TT" -- @@ -145,6 +192,7 @@ if not lib.MediaTable.statusbar then lib.MediaTable.statusbar = {} end lib.MediaTable.statusbar["Blizzard"] = [[Interface\TargetingFrame\UI-StatusBar]] lib.MediaTable.statusbar["Blizzard Character Skills Bar"] = [[Interface\PaperDollInfoFrame\UI-Character-Skills-Bar]] +lib.MediaTable.statusbar["Blizzard Raid Bar"] = [[Interface\RaidFrame\Raid-Bar-Hp-Fill]] lib.DefaultMedia.statusbar = "Blizzard" -- SOUND @@ -174,7 +222,14 @@ error(MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(key)) end mediatype = mediatype:lower() - if mediatype == lib.MediaType.FONT and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then return false end + if mediatype == lib.MediaType.FONT and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then return false end + if mediatype == lib.MediaType.SOUND and type(data) == "string" then + local path = data:lower() + -- Only ogg and mp3 are valid sounds. + if not path:find(".ogg", nil, true) and not path:find(".mp3", nil, true) then + return false + end + end if not mediaTable[mediatype] then mediaTable[mediatype] = {} end local mtable = mediaTable[mediatype] if mtable[key] then return false end
--- a/Libs/LibSharedMedia-3.0/lib.xml Sun Mar 11 10:50:42 2018 -0300 +++ b/Libs/LibSharedMedia-3.0/lib.xml Fri Jul 20 19:04:12 2018 -0300 @@ -1,4 +1,4 @@ <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> <Script file="LibSharedMedia-3.0.lua" /> -</Ui> \ No newline at end of file +</Ui>
