diff --git a/Libs/Ace3.lua b/Libs/Ace3.lua index 2fa8c09..3461a23 100644 --- a/Libs/Ace3.lua +++ b/Libs/Ace3.lua @@ -60,14 +60,14 @@ function Ace3:Open() self:Print("No Configs are Registered") return end - + if not frame then frame = gui:Create("Frame") frame:ReleaseChildren() frame:SetTitle("Ace3 Options") frame:SetLayout("FILL") frame:SetCallback("OnClose", frameOnClose) - + select = gui:Create("DropdownGroup") select:SetGroupList(configs) select:SetCallback("OnGroupSelected", ConfigSelected) diff --git a/Libs/Ace3.toc b/Libs/Ace3.toc index 5c70200..67084bb 100644 --- a/Libs/Ace3.toc +++ b/Libs/Ace3.toc @@ -1,4 +1,4 @@ -## Interface: 80100 +## Interface: 80200 ## Title: Lib: Ace3 ## Notes: AddOn development framework diff --git a/Libs/AceAddon-3.0/AceAddon-3.0.lua b/Libs/AceAddon-3.0/AceAddon-3.0.lua index e9d4154..2b2a00e 100644 --- a/Libs/AceAddon-3.0/AceAddon-3.0.lua +++ b/Libs/AceAddon-3.0/AceAddon-3.0.lua @@ -6,29 +6,29 @@ -- * **OnEnable** which gets called during the PLAYER_LOGIN event, when most of the data provided by the game is already present. -- * **OnDisable**, which is only called when your addon is manually being disabled. -- @usage --- -- A small (but complete) addon, that doesn't do anything, +-- -- A small (but complete) addon, that doesn't do anything, -- -- but shows usage of the callbacks. -- local MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon") --- +-- -- function MyAddon:OnInitialize() --- -- do init tasks here, like loading the Saved Variables, +-- -- do init tasks here, like loading the Saved Variables, -- -- or setting up slash commands. -- end --- +-- -- function MyAddon:OnEnable() -- -- Do more initialization here, that really enables the use of your addon. --- -- Register Events, Hook functions, Create Frames, Get information from +-- -- Register Events, Hook functions, Create Frames, Get information from -- -- the game that wasn't available in OnInitialize -- end -- -- function MyAddon:OnDisable() -- -- Unhook, Unregister Events, Hide frames that you created. --- -- You would probably only use an OnDisable if you want to +-- -- You would probably only use an OnDisable if you want to -- -- build a "standby" mode, or be able to toggle modules on/off. -- end -- @class file -- @name AceAddon-3.0.lua --- @release $Id: AceAddon-3.0.lua 1184 2018-07-21 14:13:14Z nevcairiel $ +-- @release $Id: AceAddon-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ local MAJOR, MINOR = "AceAddon-3.0", 12 local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR) @@ -75,7 +75,7 @@ end local Enable, Disable, EnableModule, DisableModule, Embed, NewModule, GetModule, GetName, SetDefaultModuleState, SetDefaultModuleLibraries, SetEnabledState, SetDefaultModulePrototype -- used in the addon metatable -local function addontostring( self ) return self.name end +local function addontostring( self ) return self.name end -- Check if the addon is queued for initialization local function queuedForInitialization(addon) @@ -88,14 +88,14 @@ local function queuedForInitialization(addon) end --- Create a new AceAddon-3.0 addon. --- Any libraries you specified will be embeded, and the addon will be scheduled for +-- Any libraries you specified will be embeded, and the addon will be scheduled for -- its OnInitialize and OnEnable callbacks. -- The final addon object, with all libraries embeded, will be returned. -- @paramsig [object ,]name[, lib, ...] -- @param object Table to use as a base for the addon (optional) -- @param name Name of the addon object to create -- @param lib List of libraries to embed into the addon --- @usage +-- @usage -- -- Create a simple addon object -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceEvent-3.0") -- @@ -115,10 +115,10 @@ function AceAddon:NewAddon(objectorname, ...) if type(name)~="string" then error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2) end - if self.addons[name] then + if self.addons[name] then error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - Addon '%s' already exists."):format(name), 2) end - + object = object or {} object.name = name @@ -128,7 +128,7 @@ function AceAddon:NewAddon(objectorname, ...) for k, v in pairs(oldmeta) do addonmeta[k] = v end end addonmeta.__tostring = addontostring - + setmetatable( object, addonmeta ) self.addons[name] = object object.modules = {} @@ -136,7 +136,7 @@ function AceAddon:NewAddon(objectorname, ...) object.defaultModuleLibraries = {} Embed( object ) -- embed NewModule, GetModule methods self:EmbedLibraries(object, select(i,...)) - + -- add to queue of addons to be initialized upon ADDON_LOADED tinsert(self.initializequeue, object) return object @@ -147,7 +147,7 @@ end -- Throws an error if the addon object cannot be found (except if silent is set). -- @param name unique name of the addon object -- @param silent if true, the addon is optional, silently return nil if its not found --- @usage +-- @usage -- -- Get the Addon -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon") function AceAddon:GetAddon(name, silent) @@ -202,7 +202,7 @@ end -- @paramsig name[, silent] -- @param name unique name of the module -- @param silent if true, the module is optional, silently return nil if its not found (optional) --- @usage +-- @usage -- -- Get the Addon -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon") -- -- Get the Module @@ -225,23 +225,23 @@ local function IsModuleTrue(self) return true end -- @param name unique name of the module -- @param prototype object to derive this module from, methods and values from this table will be mixed into the module (optional) -- @param lib List of libraries to embed into the addon --- @usage +-- @usage -- -- Create a module with some embeded libraries -- MyModule = MyAddon:NewModule("MyModule", "AceEvent-3.0", "AceHook-3.0") --- +-- -- -- Create a module with a prototype -- local prototype = { OnEnable = function(self) print("OnEnable called!") end } -- MyModule = MyAddon:NewModule("MyModule", prototype, "AceEvent-3.0", "AceHook-3.0") function NewModule(self, name, prototype, ...) if type(name) ~= "string" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2) end if type(prototype) ~= "string" and type(prototype) ~= "table" and type(prototype) ~= "nil" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'prototype' - table (prototype), string (lib) or nil expected got '%s'."):format(type(prototype)), 2) end - + if self.modules[name] then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - Module '%s' already exists."):format(name), 2) end - + -- modules are basically addons. We treat them as such. They will be added to the initializequeue properly as well. -- NewModule can only be called after the parent addon is present thus the modules will be initialized after their parent is. local module = AceAddon:NewAddon(fmt("%s_%s", self.name or tostring(self), name)) - + module.IsModule = IsModuleTrue module:SetEnabledState(self.defaultModuleState) module.moduleName = name @@ -256,24 +256,24 @@ function NewModule(self, name, prototype, ...) if not prototype or type(prototype) == "string" then prototype = self.defaultModulePrototype or nil end - + if type(prototype) == "table" then local mt = getmetatable(module) mt.__index = prototype setmetatable(module, mt) -- More of a Base class type feel. end - + safecall(self.OnModuleCreated, self, module) -- Was in Ace2 and I think it could be a cool thing to have handy. self.modules[name] = module tinsert(self.orderedModules, module) - + return module end --- Returns the real name of the addon or module, without any prefix. -- @name //addon//:GetName --- @paramsig --- @usage +-- @paramsig +-- @usage -- print(MyAddon:GetName()) -- -- prints "MyAddon" function GetName(self) @@ -285,8 +285,8 @@ end -- and enabling all modules of the addon (unless explicitly disabled).\\ -- :Enable() also sets the internal `enableState` variable to true -- @name //addon//:Enable --- @paramsig --- @usage +-- @paramsig +-- @usage -- -- Enable MyModule -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon") -- MyModule = MyAddon:GetModule("MyModule") @@ -306,8 +306,8 @@ end -- and disabling all modules of the addon.\\ -- :Disable() also sets the internal `enableState` variable to false -- @name //addon//:Disable --- @paramsig --- @usage +-- @paramsig +-- @usage -- -- Disable MyAddon -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon") -- MyAddon:Disable() @@ -320,7 +320,7 @@ end -- Short-hand function that retrieves the module via `:GetModule` and calls `:Enable` on the module object. -- @name //addon//:EnableModule -- @paramsig name --- @usage +-- @usage -- -- Enable MyModule using :GetModule -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon") -- MyModule = MyAddon:GetModule("MyModule") @@ -338,7 +338,7 @@ end -- Short-hand function that retrieves the module via `:GetModule` and calls `:Disable` on the module object. -- @name //addon//:DisableModule -- @paramsig name --- @usage +-- @usage -- -- Disable MyModule using :GetModule -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon") -- MyModule = MyAddon:GetModule("MyModule") @@ -357,7 +357,7 @@ end -- @name //addon//:SetDefaultModuleLibraries -- @paramsig lib[, lib, ...] -- @param lib List of libraries to embed into the addon --- @usage +-- @usage -- -- Create the addon object -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon") -- -- Configure default libraries for modules (all modules need AceEvent-3.0) @@ -376,7 +376,7 @@ end -- @name //addon//:SetDefaultModuleState -- @paramsig state -- @param state Default state for new modules, true for enabled, false for disabled --- @usage +-- @usage -- -- Create the addon object -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon") -- -- Set the default state to "disabled" @@ -396,7 +396,7 @@ end -- @name //addon//:SetDefaultModulePrototype -- @paramsig prototype -- @param prototype Default prototype for the new modules (table) --- @usage +-- @usage -- -- Define a prototype -- local prototype = { OnEnable = function(self) print("OnEnable called!") end } -- -- Set the default prototype @@ -428,8 +428,8 @@ end --- Return an iterator of all modules associated to the addon. -- @name //addon//:IterateModules --- @paramsig --- @usage +-- @paramsig +-- @usage -- -- Enable all modules -- for name, module in MyAddon:IterateModules() do -- module:Enable() @@ -438,13 +438,13 @@ local function IterateModules(self) return pairs(self.modules) end -- Returns an iterator of all embeds in the addon -- @name //addon//:IterateEmbeds --- @paramsig +-- @paramsig local function IterateEmbeds(self) return pairs(AceAddon.embeds[self]) end --- Query the enabledState of an addon. -- @name //addon//:IsEnabled --- @paramsig --- @usage +-- @paramsig +-- @usage -- if MyAddon:IsEnabled() then -- MyAddon:Disable() -- end @@ -489,20 +489,20 @@ end -- - Initialize the addon after creation. -- This function is only used internally during the ADDON_LOADED event --- It will call the **OnInitialize** function on the addon object (if present), +-- It will call the **OnInitialize** function on the addon object (if present), -- and the **OnEmbedInitialize** function on all embeded libraries. --- +-- -- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing. -- @param addon addon object to intialize function AceAddon:InitializeAddon(addon) safecall(addon.OnInitialize, addon) - + local embeds = self.embeds[addon] for i = 1, #embeds do local lib = LibStub:GetLibrary(embeds[i], true) if lib then safecall(lib.OnEmbedInitialize, lib, addon) end end - + -- we don't call InitializeAddon on modules specifically, this is handled -- from the event handler and only done _once_ end @@ -510,7 +510,7 @@ end -- - Enable the addon after creation. -- Note: This function is only used internally during the PLAYER_LOGIN event, or during ADDON_LOADED, -- if IsLoggedIn() already returns true at that point, e.g. for LoD Addons. --- It will call the **OnEnable** function on the addon object (if present), +-- It will call the **OnEnable** function on the addon object (if present), -- and the **OnEmbedEnable** function on all embeded libraries.\\ -- This function does not toggle the enable state of the addon itself, and will return early if the addon is disabled. -- @@ -520,12 +520,12 @@ end function AceAddon:EnableAddon(addon) if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end if self.statuses[addon.name] or not addon.enabledState then return false end - + -- set the statuses first, before calling the OnEnable. this allows for Disabling of the addon in OnEnable. self.statuses[addon.name] = true - + safecall(addon.OnEnable, addon) - + -- make sure we're still enabled before continueing if self.statuses[addon.name] then local embeds = self.embeds[addon] @@ -533,7 +533,7 @@ function AceAddon:EnableAddon(addon) local lib = LibStub:GetLibrary(embeds[i], true) if lib then safecall(lib.OnEmbedEnable, lib, addon) end end - + -- enable possible modules. local modules = addon.orderedModules for i = 1, #modules do @@ -545,24 +545,24 @@ end -- - Disable the addon -- Note: This function is only used internally. --- It will call the **OnDisable** function on the addon object (if present), +-- It will call the **OnDisable** function on the addon object (if present), -- and the **OnEmbedDisable** function on all embeded libraries.\\ -- This function does not toggle the enable state of the addon itself, and will return early if the addon is still enabled. -- --- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing. +-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing. -- Use :Disable on the addon itself instead. -- @param addon addon object to enable function AceAddon:DisableAddon(addon) if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end if not self.statuses[addon.name] then return false end - + -- set statuses first before calling OnDisable, this allows for aborting the disable in OnDisable. self.statuses[addon.name] = false - + safecall( addon.OnDisable, addon ) - + -- make sure we're still disabling... - if not self.statuses[addon.name] then + if not self.statuses[addon.name] then local embeds = self.embeds[addon] for i = 1, #embeds do local lib = LibStub:GetLibrary(embeds[i], true) @@ -574,12 +574,12 @@ function AceAddon:DisableAddon(addon) self:DisableAddon(modules[i]) end end - + return not self.statuses[addon.name] -- return true if we're disabled end --- Get an iterator over all registered addons. --- @usage +-- @usage -- -- Print a list of all installed AceAddon's -- for name, addon in AceAddon:IterateAddons() do -- print("Addon: " .. name) @@ -587,7 +587,7 @@ end function AceAddon:IterateAddons() return pairs(self.addons) end --- Get an iterator over the internal status registry. --- @usage +-- @usage -- -- Print a list of all enabled addons -- for name, status in AceAddon:IterateAddonStatus() do -- if status then @@ -613,7 +613,7 @@ local function onEvent(this, event, arg1) AceAddon:InitializeAddon(addon) tinsert(AceAddon.enablequeue, addon) end - + if IsLoggedIn() then while(#AceAddon.enablequeue > 0) do local addon = tremove(AceAddon.enablequeue, 1) diff --git a/Libs/AceBucket-3.0/AceBucket-3.0.lua b/Libs/AceBucket-3.0/AceBucket-3.0.lua index 5d42530..514c05e 100644 --- a/Libs/AceBucket-3.0/AceBucket-3.0.lua +++ b/Libs/AceBucket-3.0/AceBucket-3.0.lua @@ -1,28 +1,28 @@ --- A bucket to catch events in. **AceBucket-3.0** provides throttling of events that fire in bursts and -- your addon only needs to know about the full burst. --- +-- -- This Bucket implementation works as follows:\\ -- Initially, no schedule is running, and its waiting for the first event to happen.\\ -- The first event will start the bucket, and get the scheduler running, which will collect all --- events in the given interval. When that interval is reached, the bucket is pushed to the --- callback and a new schedule is started. When a bucket is empty after its interval, the scheduler is +-- events in the given interval. When that interval is reached, the bucket is pushed to the +-- callback and a new schedule is started. When a bucket is empty after its interval, the scheduler is -- stopped, and the bucket is only listening for the next event to happen, basically back in its initial state. --- --- In addition, the buckets collect information about the "arg1" argument of the events that fire, and pass those as a +-- +-- In addition, the buckets collect information about the "arg1" argument of the events that fire, and pass those as a -- table to your callback. This functionality was mostly designed for the UNIT_* events.\\ -- The table will have the different values of "arg1" as keys, and the number of occurances as their value, e.g.\\ -- { ["player"] = 2, ["target"] = 1, ["party1"] = 1 } -- --- **AceBucket-3.0** can be embeded into your addon, either explicitly by calling AceBucket:Embed(MyAddon) or by +-- **AceBucket-3.0** can be embeded into your addon, either explicitly by calling AceBucket:Embed(MyAddon) or by -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object -- and can be accessed directly, without having to explicitly call AceBucket itself.\\ -- It is recommended to embed AceBucket, otherwise you'll have to specify a custom `self` on all calls you -- make into AceBucket. -- @usage -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("BucketExample", "AceBucket-3.0") --- +-- -- function MyAddon:OnEnable() --- -- Register a bucket that listens to all the HP related events, +-- -- Register a bucket that listens to all the HP related events, -- -- and fires once per second -- self:RegisterBucketEvent({"UNIT_HEALTH", "UNIT_MAXHEALTH"}, 1, "UpdateHealth") -- end @@ -34,7 +34,7 @@ -- end -- @class file -- @name AceBucket-3.0.lua --- @release $Id: AceBucket-3.0.lua 1185 2018-07-21 14:15:16Z nevcairiel $ +-- @release $Id: AceBucket-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ local MAJOR, MINOR = "AceBucket-3.0", 4 local AceBucket, oldminor = LibStub:NewLibrary(MAJOR, MINOR) @@ -79,7 +79,7 @@ end -- send the bucket to the callback function and schedule the next FireBucket in interval seconds local function FireBucket(bucket) local received = bucket.received - + -- we dont want to fire empty buckets if next(received) ~= nil then local callback = bucket.callback @@ -88,11 +88,11 @@ local function FireBucket(bucket) else safecall(callback, received) end - + for k in pairs(received) do received[k] = nil end - + -- if the bucket was not empty, schedule another FireBucket in interval seconds bucket.timer = AceTimer.ScheduleTimer(bucket, FireBucket, bucket.interval, bucket) else -- if it was empty, clear the timer and wait for the next event @@ -101,16 +101,16 @@ local function FireBucket(bucket) end -- BucketHandler ( event, arg1 ) --- +-- -- callback func for AceEvent -- stores arg1 in the received table, and schedules the bucket if necessary local function BucketHandler(self, event, arg1) if arg1 == nil then arg1 = "nil" end - + self.received[arg1] = (self.received[arg1] or 0) + 1 - + -- if we are not scheduled yet, start a timer on the interval for our bucket to be cleared if not self.timer then self.timer = AceTimer.ScheduleTimer(self, FireBucket, self.interval, self) @@ -125,14 +125,14 @@ end -- isMessage(boolean) - register AceEvent Messages instead of game events local function RegisterBucket(self, event, interval, callback, isMessage) -- try to fetch the librarys - if not AceEvent or not AceTimer then + if not AceEvent or not AceTimer then AceEvent = LibStub:GetLibrary("AceEvent-3.0", true) AceTimer = LibStub:GetLibrary("AceTimer-3.0", true) if not AceEvent or not AceTimer then error(MAJOR .. " requires AceEvent-3.0 and AceTimer-3.0", 3) end end - + if type(event) ~= "string" and type(event) ~= "table" then error("Usage: RegisterBucket(event, interval, callback): 'event' - string or table expected.", 3) end if not callback then if type(event) == "string" then @@ -144,7 +144,7 @@ local function RegisterBucket(self, event, interval, callback, isMessage) if not tonumber(interval) then error("Usage: RegisterBucket(event, interval, callback): 'interval' - number expected.", 3) end if type(callback) ~= "string" and type(callback) ~= "function" then error("Usage: RegisterBucket(event, interval, callback): 'callback' - string or function or nil expected.", 3) end if type(callback) == "string" and type(self[callback]) ~= "function" then error("Usage: RegisterBucket(event, interval, callback): 'callback' - method not found on target object.", 3) end - + local bucket = next(bucketCache) if bucket then bucketCache[bucket] = nil @@ -152,9 +152,9 @@ local function RegisterBucket(self, event, interval, callback, isMessage) bucket = { handler = BucketHandler, received = {} } end bucket.object, bucket.callback, bucket.interval = self, callback, tonumber(interval) - + local regFunc = isMessage and AceEvent.RegisterMessage or AceEvent.RegisterEvent - + if type(event) == "table" then for _,e in pairs(event) do regFunc(bucket, e, "handler") @@ -162,10 +162,10 @@ local function RegisterBucket(self, event, interval, callback, isMessage) else regFunc(bucket, event, "handler") end - + local handle = tostring(bucket) AceBucket.buckets[handle] = bucket - + return handle end @@ -177,7 +177,7 @@ end -- @usage -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceBucket-3.0") -- MyAddon:RegisterBucketEvent("BAG_UPDATE", 0.2, "UpdateBags") --- +-- -- function MyAddon:UpdateBags() -- -- do stuff -- end @@ -193,7 +193,7 @@ end -- @usage -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceBucket-3.0") -- MyAddon:RegisterBucketEvent("SomeAddon_InformationMessage", 0.2, "ProcessData") --- +-- -- function MyAddon:ProcessData() -- -- do stuff -- end @@ -208,17 +208,17 @@ function AceBucket:UnregisterBucket(handle) if bucket then AceEvent.UnregisterAllEvents(bucket) AceEvent.UnregisterAllMessages(bucket) - + -- clear any remaining data in the bucket for k in pairs(bucket.received) do bucket.received[k] = nil end - + if bucket.timer then AceTimer.CancelTimer(bucket, bucket.timer) bucket.timer = nil end - + AceBucket.buckets[handle] = nil -- store our bucket in the cache bucketCache[bucket] = true @@ -240,10 +240,10 @@ end -- embedding and embed handling local mixins = { "RegisterBucketEvent", - "RegisterBucketMessage", + "RegisterBucketMessage", "UnregisterBucket", "UnregisterAllBuckets", -} +} -- Embeds AceBucket into the target object making the functions from the mixins list available on target:.. -- @param target target object to embed AceBucket in diff --git a/Libs/AceComm-3.0/AceComm-3.0.lua b/Libs/AceComm-3.0/AceComm-3.0.lua index 9a38979..242d92c 100644 --- a/Libs/AceComm-3.0/AceComm-3.0.lua +++ b/Libs/AceComm-3.0/AceComm-3.0.lua @@ -2,14 +2,14 @@ -- It'll automatically split the messages into multiple parts and rebuild them on the receiving end.\\ -- **ChatThrottleLib** is of course being used to avoid being disconnected by the server. -- --- **AceComm-3.0** can be embeded into your addon, either explicitly by calling AceComm:Embed(MyAddon) or by +-- **AceComm-3.0** can be embeded into your addon, either explicitly by calling AceComm:Embed(MyAddon) or by -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object -- and can be accessed directly, without having to explicitly call AceComm itself.\\ -- It is recommended to embed AceComm, otherwise you'll have to specify a custom `self` on all calls you -- make into AceComm. -- @class file -- @name AceComm-3.0 --- @release $Id: AceComm-3.0.lua 1174 2018-05-14 17:29:49Z h.leppkes@gmail.com $ +-- @release $Id: AceComm-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ --[[ AceComm-3.0 @@ -52,7 +52,7 @@ AceComm.multipart_origprefixes = nil AceComm.multipart_reassemblers = nil -- the multipart message spool: indexed by a combination of sender+distribution+ -AceComm.multipart_spool = AceComm.multipart_spool or {} +AceComm.multipart_spool = AceComm.multipart_spool or {} --- Register for Addon Traffic on a specified prefix -- @param prefix A printable character (\032-\255) classification of the message (typically AddonName or AddonNameEvent), max 16 characters @@ -90,7 +90,7 @@ function AceComm:SendCommMessage(prefix, text, distribution, target, prio, callb type(text)=="string" and type(distribution)=="string" and (target==nil or type(target)=="string" or type(target)=="number") and - (prio=="BULK" or prio=="NORMAL" or prio=="ALERT") + (prio=="BULK" or prio=="NORMAL" or prio=="ALERT") ) then error('Usage: SendCommMessage(addon, "prefix", "text", "distribution"[, "target"[, "prio"[, callbackFn, callbackarg]]])', 2) end @@ -105,7 +105,7 @@ function AceComm:SendCommMessage(prefix, text, distribution, target, prio, callb return callbackFn(callbackArg, sent, textlen) end end - + local forceMultipart if match(text, "^[\001-\009]") then -- 4.1+: see if the first character is a control character -- we need to escape the first character with a \004 @@ -150,17 +150,17 @@ do local compost = setmetatable({}, {__mode = "k"}) local function new() local t = next(compost) - if t then + if t then compost[t]=nil for i=#t,3,-1 do -- faster than pairs loop. don't even nil out 1/2 since they'll be overwritten t[i]=nil end return t end - + return {} end - + local function lostdatawarning(prefix,sender,where) DEFAULT_CHAT_FRAME:AddMessage(MAJOR..": Warning: lost network data regarding '"..tostring(prefix).."' from '"..tostring(sender).."' (in "..where..")") end @@ -168,14 +168,14 @@ do function AceComm:OnReceiveMultipartFirst(prefix, message, distribution, sender) local key = prefix.."\t"..distribution.."\t"..sender -- a unique stream is defined by the prefix + distribution + sender local spool = AceComm.multipart_spool - + --[[ - if spool[key] then + if spool[key] then lostdatawarning(prefix,sender,"First") -- continue and overwrite end --]] - + spool[key] = message -- plain string for now end @@ -183,7 +183,7 @@ do local key = prefix.."\t"..distribution.."\t"..sender -- a unique stream is defined by the prefix + distribution + sender local spool = AceComm.multipart_spool local olddata = spool[key] - + if not olddata then --lostdatawarning(prefix,sender,"Next") return @@ -204,14 +204,14 @@ do local key = prefix.."\t"..distribution.."\t"..sender -- a unique stream is defined by the prefix + distribution + sender local spool = AceComm.multipart_spool local olddata = spool[key] - + if not olddata then --lostdatawarning(prefix,sender,"End") return end spool[key] = nil - + if type(olddata) == "table" then -- if we've received a "next", the spooled data will be a table for rapid & garbage-free tconcat tinsert(olddata, message) diff --git a/Libs/AceComm-3.0/ChatThrottleLib.lua b/Libs/AceComm-3.0/ChatThrottleLib.lua index 01088f6..ad21af4 100644 --- a/Libs/AceComm-3.0/ChatThrottleLib.lua +++ b/Libs/AceComm-3.0/ChatThrottleLib.lua @@ -3,7 +3,7 @@ -- -- Manages AddOn chat output to keep player from getting kicked off. -- --- ChatThrottleLib:SendChatMessage/:SendAddonMessage functions that accept +-- ChatThrottleLib:SendChatMessage/:SendAddonMessage functions that accept -- a Priority ("BULK", "NORMAL", "ALERT") as well as prefix for SendChatMessage. -- -- Priorities get an equal share of available bandwidth when fully loaded. @@ -118,7 +118,7 @@ end ----------------------------------------------------------------------- --- Recycling bin for pipes +-- Recycling bin for pipes -- A pipe is a plain integer-indexed queue of messages -- Pipes normally live in Rings of pipes (3 rings total, one per priority) @@ -169,7 +169,7 @@ end -- Initialize queues, set up frame for OnUpdate, etc -function ChatThrottleLib:Init() +function ChatThrottleLib:Init() -- Set up queues if not self.Prio then @@ -356,8 +356,8 @@ function ChatThrottleLib.OnUpdate(this,delay) -- See how many of our priorities have queued messages (we only have 3, don't worry about the loop) local n = 0 for prioname,Prio in pairs(self.Prio) do - if Prio.Ring.pos or Prio.avail < 0 then - n = n + 1 + if Prio.Ring.pos or Prio.avail < 0 then + n = n + 1 end end diff --git a/Libs/AceConfig-3.0/AceConfig-3.0.lua b/Libs/AceConfig-3.0/AceConfig-3.0.lua index a99ddf7..5071cdc 100644 --- a/Libs/AceConfig-3.0/AceConfig-3.0.lua +++ b/Libs/AceConfig-3.0/AceConfig-3.0.lua @@ -3,7 +3,7 @@ -- as well as associate it with a slash command. -- @class file -- @name AceConfig-3.0 --- @release $Id: AceConfig-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $ +-- @release $Id: AceConfig-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ --[[ AceConfig-3.0 @@ -45,7 +45,7 @@ local pcall, error, type, pairs = pcall, error, type, pairs function AceConfig:RegisterOptionsTable(appName, options, slashcmd) local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options) if not ok then error(msg, 2) end - + if slashcmd then if type(slashcmd) == "table" then for _,cmd in pairs(slashcmd) do diff --git a/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua b/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua index 33f9fe1..5113875 100644 --- a/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua +++ b/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua @@ -1,7 +1,7 @@ --- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames. -- @class file -- @name AceConfigCmd-3.0 --- @release $Id: AceConfigCmd-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $ +-- @release $Id: AceConfigCmd-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ --[[ AceConfigCmd-3.0 @@ -63,7 +63,7 @@ local funcmsg = "expected function or member name" -- pickfirstset() - picks the first non-nil value and returns it -local function pickfirstset(...) +local function pickfirstset(...) for i=1,select("#",...) do if select(i,...)~=nil then return select(i,...) @@ -120,7 +120,7 @@ local function callfunction(info, tab, methodtype, ...) info.arg = tab.arg info.option = tab info.type = tab.type - + if type(method)=="function" then return method(info, ...) else @@ -131,7 +131,7 @@ end -- do_final() - do the final step (set/execute) along with validation and confirmation local function do_final(info, inputpos, tab, methodtype, ...) - if info.validate then + if info.validate then local res = callmethod(info,inputpos,tab,"validate",...) if type(res)=="string" then usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res) @@ -139,7 +139,7 @@ local function do_final(info, inputpos, tab, methodtype, ...) end end -- console ignores .confirm - + callmethod(info,inputpos,tab,methodtype, ...) end @@ -152,8 +152,8 @@ local function getparam(info, inputpos, tab, depth, paramname, types, errormsg) if val~=nil then if val==false then val=nil - elseif not types[type(val)] then - err(info, inputpos, "'" .. paramname.. "' - "..errormsg) + elseif not types[type(val)] then + err(info, inputpos, "'" .. paramname.. "' - "..errormsg) end info[paramname] = val info[paramname.."_at"] = depth @@ -166,13 +166,13 @@ end local dummytable={} local function iterateargs(tab) - if not tab.plugins then - return pairs(tab.args) + if not tab.plugins then + return pairs(tab.args) end - + local argtabkey,argtab=next(tab.plugins) local v - + return function(_, k) while argtab do k,v = next(argtab, k) @@ -206,18 +206,18 @@ local function showhelp(info, inputpos, tab, depth, noHead) if not noHead then print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":") end - + local sortTbl = {} -- [1..n]=name local refTbl = {} -- [name]=tableref - + for k,v in iterateargs(tab) do if not refTbl[k] then -- a plugin overriding something in .args tinsert(sortTbl, k) refTbl[k] = v end end - - tsort(sortTbl, function(one, two) + + tsort(sortTbl, function(one, two) local o1 = refTbl[one].order or 100 local o2 = refTbl[two].order or 100 if type(o1) == "function" or type(o1) == "string" then @@ -240,7 +240,7 @@ local function showhelp(info, inputpos, tab, depth, noHead) if o1==o2 then return tostring(one)<tostring(two) end -- compare names return o1<o2 end) - + for i = 1, #sortTbl do local k = sortTbl[i] local v = refTbl[k] @@ -327,7 +327,7 @@ local function keybindingValidateFunc(text) return s end --- handle() - selfrecursing function that processes input->optiontable +-- handle() - selfrecursing function that processes input->optiontable -- - depth - starts at 0 -- - retfalse - return false rather than produce error if a match is not found (used by inlined groups) @@ -346,16 +346,16 @@ local function handle(info, inputpos, tab, depth, retfalse) local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg) local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg) --local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg) - + ------------------------------------------------------------------- -- Act according to .type of this table - + if tab.type=="group" then ------------ group -------------------------------------------- - + if type(tab.args)~="table" then err(info, inputpos) end if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end - + -- grab next arg from input local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos) if not arg then @@ -363,11 +363,11 @@ local function handle(info, inputpos, tab, depth, retfalse) return end nextpos=nextpos+1 - + -- loop .args and try to find a key with a matching name for k,v in iterateargs(tab) do if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end - + -- is this child an inline group? if so, traverse into it if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then info[depth+1] = k @@ -383,8 +383,8 @@ local function handle(info, inputpos, tab, depth, retfalse) return handle(info,nextpos,v,depth+1) end end - - -- no match + + -- no match if retfalse then -- restore old infotable members and return false to indicate failure info.handler,info.handler_at = oldhandler,oldhandler_at @@ -395,23 +395,23 @@ local function handle(info, inputpos, tab, depth, retfalse) --info.confirm,info.confirm_at = oldconfirm,oldconfirm_at return false end - + -- couldn't find the command, display error usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"]) return end - + local str = strsub(info.input,inputpos); - + if tab.type=="execute" then ------------ execute -------------------------------------------- do_final(info, inputpos, tab, "func") - - + + elseif tab.type=="input" then ------------ input -------------------------------------------- - + local res = true if tab.pattern then if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end @@ -420,11 +420,11 @@ local function handle(info, inputpos, tab, depth, retfalse) return end end - + do_final(info, inputpos, tab, "set", str) - - + + elseif tab.type=="toggle" then ------------ toggle -------------------------------------------- local b @@ -444,7 +444,7 @@ local function handle(info, inputpos, tab, depth, retfalse) else b = not b end - + elseif str==L["on"] then b = true elseif str==L["off"] then @@ -459,9 +459,9 @@ local function handle(info, inputpos, tab, depth, retfalse) end return end - + do_final(info, inputpos, tab, "set", b) - + elseif tab.type=="range" then ------------ range -------------------------------------------- @@ -481,21 +481,21 @@ local function handle(info, inputpos, tab, depth, retfalse) usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) ) return end - + do_final(info, inputpos, tab, "set", val) - + elseif tab.type=="select" then ------------ select ------------------------------------ local str = strtrim(strlower(str)) - + local values = tab.values if type(values) == "function" or type(values) == "string" then info.values = values values = callmethod(info, inputpos, tab, "values") info.values = nil end - + if str == "" then local b = callmethod(info, inputpos, tab, "get") local fmt = "|cffffff78- [%s]|r %s" @@ -512,7 +512,7 @@ local function handle(info, inputpos, tab, depth, retfalse) end local ok - for k,v in pairs(values) do + for k,v in pairs(values) do if strlower(k)==str then str = k -- overwrite with key (in case of case mismatches) ok = true @@ -523,20 +523,20 @@ local function handle(info, inputpos, tab, depth, retfalse) usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"]) return end - + do_final(info, inputpos, tab, "set", str) - + elseif tab.type=="multiselect" then ------------ multiselect ------------------------------------------- local str = strtrim(strlower(str)) - + local values = tab.values if type(values) == "function" or type(values) == "string" then info.values = values values = callmethod(info, inputpos, tab, "values") info.values = nil end - + if str == "" then local fmt = "|cffffff78- [%s]|r %s" local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r" @@ -550,7 +550,7 @@ local function handle(info, inputpos, tab, depth, retfalse) end return end - + --build a table of the selections, checking that they exist --parse for =on =off =default in the process --table will be key = true for options that should toggle, key = [on|off|default] for options to be set @@ -559,25 +559,25 @@ local function handle(info, inputpos, tab, depth, retfalse) --parse option=on etc local opt, val = v:match('(.+)=(.+)') --get option if toggling - if not opt then - opt = v + if not opt then + opt = v end - + --check that the opt is valid local ok - for k,v in pairs(values) do + for k,v in pairs(values) do if strlower(k)==opt then opt = k -- overwrite with key (in case of case mismatches) ok = true break end end - + if not ok then usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"]) return end - + --check that if val was supplied it is valid if val then if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then @@ -596,14 +596,14 @@ local function handle(info, inputpos, tab, depth, retfalse) sels[opt] = true end end - + for opt, val in pairs(sels) do local newval - + if (val == true) then --toggle the option local b = callmethod(info, inputpos, tab, "get", opt) - + if tab.tristate then --cycle in true, nil, false order if b then @@ -627,11 +627,11 @@ local function handle(info, inputpos, tab, depth, retfalse) newval = nil end end - + do_final(info, inputpos, tab, "set", opt, newval) end - - + + elseif tab.type=="color" then ------------ color -------------------------------------------- local str = strtrim(strlower(str)) @@ -639,16 +639,16 @@ local function handle(info, inputpos, tab, depth, retfalse) --TODO: Show current value return end - + local r, g, b, a - + local hasAlpha = tab.hasAlpha if type(hasAlpha) == "function" or type(hasAlpha) == "string" then info.hasAlpha = hasAlpha hasAlpha = callmethod(info, inputpos, tab, 'hasAlpha') info.hasAlpha = nil end - + if hasAlpha then if str:len() == 8 and str:find("^%x*$") then --parse a hex string @@ -662,7 +662,7 @@ local function handle(info, inputpos, tab, depth, retfalse) usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str)) return end - + if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then --values are valid elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then @@ -701,7 +701,7 @@ local function handle(info, inputpos, tab, depth, retfalse) usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str)) end end - + do_final(info, inputpos, tab, "set", r,g,b,a) elseif tab.type=="keybinding" then @@ -737,7 +737,7 @@ end -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0") -- -- Use AceConsole-3.0 to register a Chat Command -- MyAddon:RegisterChatCommand("mychat", "ChatCommand") --- +-- -- -- Show the GUI if no input is supplied, otherwise handle the chat input. -- function MyAddon:ChatCommand(input) -- -- Assuming "MyOptions" is the appName of a valid options table @@ -754,7 +754,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input) error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2) end local options = assert( optgetter("cmd", MAJOR) ) - + local info = { -- Don't try to recycle this, it gets handed off to callbacks and whatnot [0] = slashcmd, appName = appName, @@ -765,7 +765,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input) uiType = "cmd", uiName = MAJOR, } - + handle(info, 1, options, 0) -- (info, inputpos, table, depth) end diff --git a/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua b/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua index d5cbc45..bcfe071 100644 --- a/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua +++ b/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua @@ -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 1197 2019-01-21 23:41:10Z nevcairiel $ +-- @release $Id: AceConfigDialog-3.0.lua 1212 2019-06-26 05:53:51Z nevcairiel $ local LibStub = LibStub local gui = LibStub("AceGUI-3.0") local reg = LibStub("AceConfigRegistry-3.0") -local MAJOR, MINOR = "AceConfigDialog-3.0", 69 +local MAJOR, MINOR = "AceConfigDialog-3.0", 73 local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR) if not AceConfigDialog then return end @@ -56,18 +56,18 @@ local width_multiplier = 170 --[[ Group Types Tree - All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree - - Descendant Groups with inline=true and thier children will not become nodes + - Descendant Groups with inline=true and thier children will not become nodes Tab - Direct Child Groups will become tabs, direct child options will appear above the tab control - - Grandchild groups will default to inline unless specified otherwise + - Grandchild groups will default to inline unless specified otherwise Select- Same as Tab but with entries in a dropdown rather than tabs Inline Groups - - Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border - - If declared on a direct child of a root node of a select group, they will appear above the group container control - - When a group is displayed inline, all descendants will also be inline members of the group + - Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border + - If declared on a direct child of a root node of a select group, they will appear above the group container control + - When a group is displayed inline, all descendants will also be inline members of the group ]] @@ -168,11 +168,11 @@ local allIsLiteral = { local function GetOptionsMemberValue(membername, option, options, path, appName, ...) --get definition for the member local inherits = isInherited[membername] - + --get the member of the option, traversing the tree if it can be inherited local member - + if inherits then local group = options if group[membername] ~= nil then @@ -187,7 +187,7 @@ local function GetOptionsMemberValue(membername, option, options, path, appName, else member = option[membername] end - + --check if we need to call a functon, or if we have a literal value if ( not allIsLiteral[membername] ) and ( type(member) == "function" or ((not stringIsLiteral[membername]) and type(member) == "string") ) then --We have a function to call @@ -196,13 +196,13 @@ local function GetOptionsMemberValue(membername, option, options, path, appName, local handler local group = options handler = group.handler or handler - + for i = 1, #path do group = GetSubOption(group, path[i]) info[i] = path[i] handler = group.handler or handler end - + info.options = options info.appName = appName info[0] = appName @@ -212,8 +212,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName, info.type = option.type info.uiType = "dialog" info.uiName = MAJOR - - local a, b, c ,d + + local a, b, c ,d --using 4 returns for the get of a color type, increase if a type needs more if type(member) == "function" then --Call the function @@ -230,8 +230,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName, return a,b,c,d else --The value isnt a function to call, return it - return member - end + return member + end end --[[calls an options function that could be inherited, method name or function ref @@ -296,7 +296,7 @@ local function compareOptions(a,b) return NameA:upper() < NameB:upper() end if OrderA < 0 then - if OrderB > 0 then + if OrderB >= 0 then return false end else @@ -315,7 +315,7 @@ end local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName) tempOrders = new() tempNames = new() - + if group.plugins then for plugin, t in pairs(group.plugins) do for k, v in pairs(t) do @@ -331,7 +331,7 @@ local function BuildSortedOptionsTable(group, keySort, opts, options, path, appN end end end - + for k, v in pairs(group.args) do if not opts[k] then tinsert(keySort, k) @@ -362,7 +362,7 @@ local function DelTree(tree) end local function CleanUserData(widget, event) - + local user = widget:GetUserDataTable() if user.path then @@ -402,7 +402,7 @@ end -- - Gets a status table for the given appname and options path. -- @param appName The application name as given to `:RegisterOptionsTable()` -- @param path The path to the options (a table with all group keys) --- @return +-- @return function AceConfigDialog:GetStatusTable(appName, path) local status = self.Status @@ -436,7 +436,7 @@ end function AceConfigDialog:SelectGroup(appName, ...) local path = new() - + local app = reg:GetOptionsTable(appName) if not app then error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2) @@ -448,9 +448,9 @@ function AceConfigDialog:SelectGroup(appName, ...) status.groups = {} end status = status.groups - local treevalue - local treestatus - + local treevalue + local treestatus + for n = 1, select("#",...) do local key = select(n, ...) @@ -477,12 +477,12 @@ function AceConfigDialog:SelectGroup(appName, ...) --the selected group will be overwritten if a child is the final target but still needs to be open treestatus.selected = treevalue treestatus.groups[treevalue] = true - + end - + --move to the next group in the path group = GetSubOption(group, key) - if not group then + if not group then break end tinsert(path, key) @@ -492,10 +492,10 @@ function AceConfigDialog:SelectGroup(appName, ...) end status = status.groups end - + del(path) reg:NotifyChange(appName) -end +end local function OptionOnMouseOver(widget, event) --show a tooltip/set the status bar to the desc text @@ -510,14 +510,14 @@ local function OptionOnMouseOver(widget, event) local desc = GetOptionsMemberValue("desc", opt, options, path, appName) local usage = GetOptionsMemberValue("usage", opt, options, path, appName) local descStyle = opt.descStyle - + if descStyle and descStyle ~= "tooltip" then return end - + GameTooltip:SetText(name, 1, .82, 0, true) - + if opt.type == "multiselect" then GameTooltip:AddLine(user.text, 0.5, 0.5, 0.8, true) - end + end if type(desc) == "string" then GameTooltip:AddLine(desc, 1, 1, 1, true) end @@ -675,7 +675,7 @@ local function ActivateControl(widget, event, ...) end end end - + local success if validated and option.type ~= "execute" then if type(validate) == "string" then @@ -690,7 +690,7 @@ local function ActivateControl(widget, event, ...) if not success then validated = false end end end - + local rootframe = user.rootframe if not validated or type(validated) == "string" then if not validated then @@ -715,7 +715,7 @@ local function ActivateControl(widget, event, ...) del(info) return true else - + local confirmText = option.confirmText --call confirm func/method if type(confirm) == "string" then @@ -756,10 +756,10 @@ local function ActivateControl(widget, event, ...) confirmText = confirmText.." - "..desc end end - + local iscustom = user.rootframe:GetUserData("iscustom") local rootframe - + if iscustom then rootframe = user.rootframe end @@ -796,7 +796,7 @@ local function ActivateControl(widget, event, ...) --full refresh of the frame, some controls dont cause this on all events if option.type == "color" then if event == "OnValueConfirmed" then - + if iscustom then AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath)) else @@ -1049,6 +1049,10 @@ local function CreateControl(userControlType, fallbackControlType) return control end +local function sortTblAsStrings(x,y) + return tostring(x) < tostring(y) -- Support numbers as keys +end + --[[ options - root of the options table being fed container - widget that controls will be placed in @@ -1079,7 +1083,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin else GroupContainer = gui:Create("SimpleGroup") end - + GroupContainer.width = "fill" GroupContainer:SetLayout("flow") container:AddChild(GroupContainer) @@ -1088,14 +1092,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin else --Control to feed local control - + local name = GetOptionsMemberValue("name", v, options, path, appName) - + if v.type == "execute" then - + local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName) local image, width, height = GetOptionsMemberValue("image",v, options, path, appName) - + local iconControl = type(image) == "string" or type(image) == "number" control = CreateControl(v.dialogControl or v.control, iconControl and "Icon" or "Button") if iconControl then @@ -1125,7 +1129,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin elseif v.type == "input" then control = CreateControl(v.dialogControl or v.control, v.multiline and "MultiLineEditBox" or "EditBox") - + if v.multiline and control.SetNumLines then control:SetNumLines(tonumber(v.multiline) or 4) end @@ -1144,15 +1148,15 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin local value = GetOptionsMemberValue("get",v, options, path, appName) control:SetValue(value) control:SetCallback("OnValueChanged",ActivateControl) - + if v.descStyle == "inline" then local desc = GetOptionsMemberValue("desc", v, options, path, appName) control:SetDescription(desc) end - + local image = GetOptionsMemberValue("image", v, options, path, appName) local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName) - + if type(image) == "string" or type(image) == "number" then if type(imageCoords) == "table" then control:SetImage(image, unpack(imageCoords)) @@ -1175,6 +1179,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin elseif v.type == "select" then local values = GetOptionsMemberValue("values", v, options, path, appName) + local sorting = GetOptionsMemberValue("sorting", v, options, path, appName) if v.style == "radio" then local disabled = CheckOptionDisabled(v, options, path, appName) local width = GetOptionsMemberValue("width",v,options,path,appName) @@ -1185,12 +1190,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin control:PauseLayout() local optionValue = GetOptionsMemberValue("get",v, options, path, appName) - local t = {} - for value, text in pairs(values) do - t[#t+1]=value + if not sorting then + sorting = {} + for value, text in pairs(values) do + sorting[#sorting+1]=value + end + tsort(sorting, sortTblAsStrings) end - tsort(t) - for k, value in ipairs(t) do + for k, value in ipairs(sorting) do local text = values[value] local radio = gui:Create("CheckBox") radio:SetLabel(text) @@ -1224,7 +1231,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin itemType = nil end control:SetLabel(name) - control:SetList(values, nil, itemType) + control:SetList(values, sorting, itemType) local value = GetOptionsMemberValue("get",v, options, path, appName) if not values[value] then value = nil @@ -1236,7 +1243,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin elseif v.type == "multiselect" then local values = GetOptionsMemberValue("values", v, options, path, appName) local disabled = CheckOptionDisabled(v, options, path, appName) - + local valuesort = new() if values then for value, text in pairs(values) do @@ -1244,7 +1251,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin end end tsort(valuesort) - + local controlType = v.dialogControl or v.control if controlType then control = gui:Create(controlType) @@ -1313,9 +1320,9 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin control:ResumeLayout() control:DoLayout() - + end - + del(valuesort) elseif v.type == "color" then @@ -1340,7 +1347,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin elseif v.type == "description" then control = CreateControl(v.dialogControl or v.control, "Label") control:SetText(name) - + local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName) if fontSize == "medium" then control:SetFontObject(GameFontHighlight) @@ -1349,10 +1356,10 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin else -- small or invalid control:SetFontObject(GameFontHighlightSmall) end - + local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName) local image, width, height = GetOptionsMemberValue("image",v, options, path, appName) - + if type(image) == "string" or type(image) == "number" then if not width then width = GetOptionsMemberValue("imageWidth",v, options, path, appName) @@ -1401,7 +1408,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin InjectInfo(control, options, v, path, rootframe, appName) container:AddChild(control) end - + end end tremove(path) @@ -1426,7 +1433,7 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button) local option = user.option local path = user.path local appName = user.appName - + local feedpath = new() for i = 1, #path do feedpath[i] = path[i] @@ -1441,8 +1448,9 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button) local name = GetOptionsMemberValue("name", group, options, feedpath, appName) local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName) - + GameTooltip:SetOwner(button, "ANCHOR_NONE") + GameTooltip:ClearAllPoints() if widget.type == "TabGroup" then GameTooltip:SetPoint("BOTTOM",button,"TOP") else @@ -1450,11 +1458,11 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button) end GameTooltip:SetText(name, 1, .82, 0, true) - + if type(desc) == "string" then GameTooltip:AddLine(desc, 1, 1, 1, true) end - + GameTooltip:Show() end @@ -1465,25 +1473,25 @@ end local function GroupExists(appName, options, path, uniquevalue) if not uniquevalue then return false end - + local feedpath = new() local temppath = new() for i = 1, #path do feedpath[i] = path[i] end - + BuildPath(feedpath, ("\001"):split(uniquevalue)) - + local group = options for i = 1, #feedpath do local v = feedpath[i] temppath[i] = v group = GetSubOption(group, v) - - if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then + + if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then del(feedpath) del(temppath) - return false + return false end end del(feedpath) @@ -1602,7 +1610,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR tab:SetCallback("OnGroupSelected", GroupSelected) tab:SetCallback("OnTabEnter", TreeOnButtonEnter) tab:SetCallback("OnTabLeave", TreeOnButtonLeave) - + local status = AceConfigDialog:GetStatusTable(appName, path) if not status.groups then status.groups = {} @@ -1622,7 +1630,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR break end end - + container:AddChild(tab) elseif grouptype == "select" then @@ -1645,7 +1653,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR if firstgroup then select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup) end - + select.width = "fill" select.height = "fill" @@ -1657,14 +1665,14 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR local tree = gui:Create("TreeGroup") InjectInfo(tree, options, group, path, rootframe, appName) tree:EnableButtonTooltips(false) - + tree.width = "fill" tree.height = "fill" tree:SetCallback("OnGroupSelected", GroupSelected) tree:SetCallback("OnButtonEnter", TreeOnButtonEnter) tree:SetCallback("OnButtonLeave", TreeOnButtonLeave) - + local status = AceConfigDialog:GetStatusTable(appName, path) if not status.groups then status.groups = {} @@ -1705,7 +1713,7 @@ local function RefreshOnUpdate(this) end this.closing[appName] = nil end - + if this.closeAll then for k, v in pairs(AceConfigDialog.OpenFrames) do if not this.closeAllOverride[k] then @@ -1715,7 +1723,7 @@ local function RefreshOnUpdate(this) this.closeAll = nil wipe(this.closeAllOverride) end - + for appName in pairs(this.apps) do if AceConfigDialog.OpenFrames[appName] then local user = AceConfigDialog.OpenFrames[appName]:GetUserDataTable() @@ -1800,10 +1808,10 @@ function AceConfigDialog:Open(appName, container, ...) local options = app("dialog", MAJOR) local f - + local path = new() local name = GetOptionsMemberValue("name", options, options, path, appName) - + --If an optional path is specified add it to the path table before feeding the options --as container is optional as well it may contain the first element of the path if type(container) == "string" then @@ -1813,7 +1821,7 @@ function AceConfigDialog:Open(appName, container, ...) for n = 1, select("#",...) do tinsert(path, (select(n, ...))) end - + local option = options if type(container) == "table" and container.type == "BlizOptionsGroup" and #path > 0 then for i = 1, #path do @@ -1821,7 +1829,7 @@ function AceConfigDialog:Open(appName, container, ...) end name = format("%s - %s", name, GetOptionsMemberValue("name", option, options, path, appName)) end - + --if a container is given feed into that if container then f = container @@ -1915,19 +1923,19 @@ end -- @param name A descriptive name to display in the options tree (defaults to appName) -- @param parent The parent to use in the interface options tree. -- @param ... The path in the options table to feed into the interface options panel. --- @return The reference to the frame registered into the Interface Options. +-- @return The reference to the frame registered into the Interface Options. function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...) local BlizOptions = AceConfigDialog.BlizOptions - + local key = appName for n = 1, select("#", ...) do key = key.."\001"..select(n, ...) end - + if not BlizOptions[appName] then BlizOptions[appName] = {} end - + if not BlizOptions[appName][key] then local group = gui:Create("BlizOptionsGroup") BlizOptions[appName][key] = group diff --git a/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua b/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua index 1e40811..f8d9225 100644 --- a/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua +++ b/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua @@ -4,14 +4,14 @@ -- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\ -- * The **uiName** field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.\\ -- * The **appName** field is the options table name as given at registration time \\ --- +-- -- :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 1193 2018-08-02 12:24:37Z funkydude $ +-- @release $Id: AceConfigRegistry-3.0.lua 1207 2019-06-23 12:08:33Z nevcairiel $ local CallbackHandler = LibStub("CallbackHandler-1.0") -local MAJOR, MINOR = "AceConfigRegistry-3.0", 18 +local MAJOR, MINOR = "AceConfigRegistry-3.0", 20 local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR) if not AceConfigRegistry then return end @@ -33,7 +33,7 @@ local error, assert = error, assert AceConfigRegistry.validated = { - -- list of options table names ran through :ValidateOptionsTable automatically. + -- list of options table names ran through :ValidateOptionsTable automatically. -- CLEARED ON PURPOSE, since newer versions may have newer validators cmd = {}, dropdown = {}, @@ -94,13 +94,20 @@ local basekeys={ } local typedkeys={ - header={}, + header={ + control=optstring, + dialogControl=optstring, + dropdownControl=optstring, + }, description={ image=optstringnumberfunc, imageCoords=optmethodtable, imageHeight=optnumber, imageWidth=optnumber, fontSize=optstringfunc, + control=optstring, + dialogControl=optstring, + dropdownControl=optstring, }, group={ args=istable, @@ -117,6 +124,9 @@ local typedkeys={ imageCoords=optmethodtable, imageHeight=optnumber, imageWidth=optnumber, + control=optstring, + dialogControl=optstring, + dropdownControl=optstring, }, input={ pattern=optstring, @@ -130,6 +140,9 @@ local typedkeys={ tristate=optbool, image=optstringnumberfunc, imageCoords=optmethodtable, + control=optstring, + dialogControl=optstring, + dropdownControl=optstring, }, tristate={ }, @@ -141,12 +154,16 @@ local typedkeys={ step=optnumber, bigStep=optnumber, isPercent=optbool, + control=optstring, + dialogControl=optstring, + dropdownControl=optstring, }, select={ values=ismethodtable, + sorting=optmethodtable, style={ - ["nil"]=true, - ["string"]={dropdown=true,radio=true}, + ["nil"]=true, + ["string"]={dropdown=true,radio=true}, _="string: 'dropdown' or 'radio'" }, control=optstring, @@ -164,9 +181,14 @@ local typedkeys={ }, color={ hasAlpha=optmethodbool, + control=optstring, + dialogControl=optstring, + dropdownControl=optstring, }, keybinding={ - -- TODO + control=optstring, + dialogControl=optstring, + dropdownControl=optstring, }, } @@ -203,13 +225,13 @@ local function validate(options,errlvl,...) if type(options.type)~="string" then err(".type: expected a string, got a "..type(options.type), errlvl,...) end - + -- get type and 'typedkeys' member local tk = typedkeys[options.type] if not tk then err(".type: unknown type '"..options.type.."'", errlvl,...) end - + -- make sure that all options[] are known parameters for k,v in pairs(options) do if not (tk[k] or basekeys[k]) then @@ -302,7 +324,7 @@ function AceConfigRegistry:RegisterOptionsTable(appName, options, skipValidation AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl) -- upgradable AceConfigRegistry.validated[uiType][appName] = true end - return options + return options end elseif type(options)=="function" then AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl) @@ -340,7 +362,7 @@ function AceConfigRegistry:GetOptionsTable(appName, uiType, uiName) if not f then return nil end - + if uiType then return f(uiType,uiName,1) -- get the table for us else diff --git a/Libs/AceConsole-3.0/AceConsole-3.0.lua b/Libs/AceConsole-3.0/AceConsole-3.0.lua index 0567a65..678fa95 100644 --- a/Libs/AceConsole-3.0/AceConsole-3.0.lua +++ b/Libs/AceConsole-3.0/AceConsole-3.0.lua @@ -2,14 +2,14 @@ -- You can register slash commands to your custom functions and use the `GetArgs` function to parse them -- to your addons individual needs. -- --- **AceConsole-3.0** can be embeded into your addon, either explicitly by calling AceConsole:Embed(MyAddon) or by +-- **AceConsole-3.0** can be embeded into your addon, either explicitly by calling AceConsole:Embed(MyAddon) or by -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object -- and can be accessed directly, without having to explicitly call AceConsole itself.\\ -- It is recommended to embed AceConsole, otherwise you'll have to specify a custom `self` on all calls you -- make into AceConsole. -- @class file -- @name AceConsole-3.0 --- @release $Id: AceConsole-3.0.lua 1143 2016-07-11 08:52:03Z nevcairiel $ +-- @release $Id: AceConsole-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ local MAJOR,MINOR = "AceConsole-3.0", 7 local AceConsole, oldminor = LibStub:NewLibrary(MAJOR, MINOR) @@ -84,11 +84,11 @@ end -- @param persist if false, the command will be soft disabled/enabled when aceconsole is used as a mixin (default: true) function AceConsole:RegisterChatCommand( command, func, persist ) if type(command)~="string" then error([[Usage: AceConsole:RegisterChatCommand( "command", func[, persist ]): 'command' - expected a string]], 2) end - + if persist==nil then persist=true end -- I'd rather have my addon's "/addon enable" around if the author screws up. Having some extra slash regged when it shouldnt be isn't as destructive. True is a better default. /Mikk - + local name = "ACECONSOLE_"..command:upper() - + if type( func ) == "string" then SlashCmdList[name] = function(input, editBox) self[func](self, input, editBox) @@ -132,9 +132,9 @@ local function nils(n, ...) return ... end end - ---- Retreive one or more space-separated arguments from a string. + +--- Retreive one or more space-separated arguments from a string. -- Treats quoted strings and itemlinks as non-spaced. -- @param str The raw argument string -- @param numargs How many arguments to get (default 1) @@ -144,7 +144,7 @@ end function AceConsole:GetArgs(str, numargs, startpos) numargs = numargs or 1 startpos = max(startpos or 1, 1) - + local pos=startpos -- find start of new arg @@ -169,24 +169,24 @@ function AceConsole:GetArgs(str, numargs, startpos) else delim_or_pipe="([| ])" end - + startpos = pos - + while true do -- find delimiter or hyperlink local ch,_ pos,_,ch = strfind(str, delim_or_pipe, pos) - + if not pos then break end - + if ch=="|" then -- some kind of escape - + if strsub(str,pos,pos+1)=="|H" then -- It's a |H....|hhyper link!|h pos=strfind(str, "|h", pos+2) -- first |h if not pos then break end - + pos=strfind(str, "|h", pos+2) -- second |h if not pos then break end elseif strsub(str,pos, pos+1) == "|T" then @@ -194,16 +194,16 @@ function AceConsole:GetArgs(str, numargs, startpos) pos=strfind(str, "|t", pos+2) if not pos then break end end - + pos=pos+2 -- skip past this escape (last |h if it was a hyperlink) - + else -- found delimiter, done with this arg return strsub(str, startpos, pos-1), AceConsole:GetArgs(str, numargs-1, pos+1) end - + end - + -- search aborted, we hit end of string. return it all as one argument. (yes, even if it's an unterminated quote or hyperlink) return strsub(str, startpos), nils(numargs-1, 1e9) end @@ -214,10 +214,10 @@ end local mixins = { "Print", "Printf", - "RegisterChatCommand", + "RegisterChatCommand", "UnregisterChatCommand", "GetArgs", -} +} -- Embeds AceConsole into the target object making the functions from the mixins list available on target:.. -- @param target target object to embed AceBucket in diff --git a/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua b/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua index 7477698..6ed3103 100644 --- a/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua +++ b/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua @@ -1,7 +1,7 @@ --- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles. -- @class file -- @name AceDBOptions-3.0 --- @release $Id: AceDBOptions-3.0.lua 1193 2018-08-02 12:24:37Z funkydude $ +-- @release $Id: AceDBOptions-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15 local AceDBOptions = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR) @@ -240,22 +240,22 @@ local tmpprofiles = {} -- @return Hashtable of all profiles with the internal name as keys and the display name as value. local function getProfileList(db, common, nocurrent) local profiles = {} - + -- copy existing profiles into the table local currentProfile = db:GetCurrentProfile() - for i,v in pairs(db:GetProfiles(tmpprofiles)) do - if not (nocurrent and v == currentProfile) then - profiles[v] = v - end + for i,v in pairs(db:GetProfiles(tmpprofiles)) do + if not (nocurrent and v == currentProfile) then + profiles[v] = v + end end - + -- add our default profiles to choose from ( or rename existing profiles) for k,v in pairs(defaultProfiles) do if (common or profiles[k]) and not (nocurrent and k == currentProfile) then profiles[k] = v end end - + return profiles end @@ -280,11 +280,11 @@ function OptionsHandlerPrototype:GetCurrentProfile() return self.db:GetCurrentProfile() end ---[[ +--[[ List all active profiles you can control the output with the .arg variable currently four modes are supported - + (empty) - return all available profiles "nocurrent" - returns all available profiles except the currently active profile "common" - returns all avaialble profiles + some commonly used profiles ("char - realm", "realm", "class", "Default") @@ -302,7 +302,7 @@ function OptionsHandlerPrototype:ListProfiles(info) else profiles = getProfileList(self.db) end - + return profiles end @@ -336,19 +336,19 @@ local function getOptionsHandler(db, noDefaultProfiles) if not defaultProfiles then generateDefaultProfiles(db) end - + local handler = AceDBOptions.handlers[db] or { db = db, noDefaultProfiles = noDefaultProfiles } - + for k,v in pairs(OptionsHandlerPrototype) do handler[k] = v end - + AceDBOptions.handlers[db] = handler return handler end --[[ - the real options table + the real options table ]] local optionsTable = { desc = { @@ -436,7 +436,7 @@ local optionsTable = { --- Get/Create a option table that you can use in your addon to control the profiles of AceDB-3.0. -- @param db The database object to create the options table for. -- @return The options table to be used in AceConfig-3.0 --- @usage +-- @usage -- -- Assuming `options` is your top-level options table and `self.db` is your database: -- options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db) function AceDBOptions:GetOptionsTable(db, noDefaultProfiles) @@ -445,7 +445,7 @@ function AceDBOptions:GetOptionsTable(db, noDefaultProfiles) name = L["profiles"], desc = L["profiles_sub"], } - + tbl.handler = getOptionsHandler(db, noDefaultProfiles) tbl.args = optionsTable diff --git a/Libs/AceEvent-3.0/AceEvent-3.0.lua b/Libs/AceEvent-3.0/AceEvent-3.0.lua index bbf55c2..7ccd880 100644 --- a/Libs/AceEvent-3.0/AceEvent-3.0.lua +++ b/Libs/AceEvent-3.0/AceEvent-3.0.lua @@ -2,14 +2,14 @@ -- All dispatching is done using **CallbackHandler-1.0**. AceEvent is a simple wrapper around -- CallbackHandler, and dispatches all game events or addon message to the registrees. -- --- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by +-- **AceEvent-3.0** can be embeded into your addon, either explicitly by calling AceEvent:Embed(MyAddon) or by -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object -- and can be accessed directly, without having to explicitly call AceEvent itself.\\ -- It is recommended to embed AceEvent, otherwise you'll have to specify a custom `self` on all calls you -- make into AceEvent. -- @class file -- @name AceEvent-3.0 --- @release $Id: AceEvent-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $ +-- @release $Id: AceEvent-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ local CallbackHandler = LibStub("CallbackHandler-1.0") local MAJOR, MINOR = "AceEvent-3.0", 4 @@ -25,22 +25,22 @@ AceEvent.embeds = AceEvent.embeds or {} -- what objects embed this lib -- APIs and registry for blizzard events, using CallbackHandler lib if not AceEvent.events then - AceEvent.events = CallbackHandler:New(AceEvent, + AceEvent.events = CallbackHandler:New(AceEvent, "RegisterEvent", "UnregisterEvent", "UnregisterAllEvents") end -function AceEvent.events:OnUsed(target, eventname) +function AceEvent.events:OnUsed(target, eventname) AceEvent.frame:RegisterEvent(eventname) end -function AceEvent.events:OnUnused(target, eventname) +function AceEvent.events:OnUnused(target, eventname) AceEvent.frame:UnregisterEvent(eventname) end -- APIs and registry for IPC messages, using CallbackHandler lib if not AceEvent.messages then - AceEvent.messages = CallbackHandler:New(AceEvent, + AceEvent.messages = CallbackHandler:New(AceEvent, "RegisterMessage", "UnregisterMessage", "UnregisterAllMessages" ) AceEvent.SendMessage = AceEvent.messages.Fire diff --git a/Libs/AceGUI-3.0/AceGUI-3.0.lua b/Libs/AceGUI-3.0/AceGUI-3.0.lua index a31a85a..66a5529 100644 --- a/Libs/AceGUI-3.0/AceGUI-3.0.lua +++ b/Libs/AceGUI-3.0/AceGUI-3.0.lua @@ -1,6 +1,6 @@ --- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs. -- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself --- to create any custom GUI. There are more extensive examples in the test suite in the Ace3 +-- to create any custom GUI. There are more extensive examples in the test suite in the Ace3 -- stand-alone distribution. -- -- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly, @@ -24,7 +24,7 @@ -- f:AddChild(btn) -- @class file -- @name AceGUI-3.0 --- @release $Id: AceGUI-3.0.lua 1193 2018-08-02 12:24:37Z funkydude $ +-- @release $Id: AceGUI-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 36 local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR) @@ -51,7 +51,7 @@ AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {} AceGUI.WidgetBase = AceGUI.WidgetBase or {} AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {} AceGUI.WidgetVersions = AceGUI.WidgetVersions or {} - + -- local upvalues local WidgetRegistry = AceGUI.WidgetRegistry local LayoutRegistry = AceGUI.LayoutRegistry @@ -79,7 +79,7 @@ do -- Internal Storage of the objects changed, from an array table -- to a hash table, and additionally we introduced versioning on -- the widgets which would discard all widgets from a pre-29 version - -- anyway, so we just clear the storage now, and don't try to + -- anyway, so we just clear the storage now, and don't try to -- convert the storage tables to the new format. -- This should generally not cause *many* widgets to end up in trash, -- since once dialogs are opened, all addons should be loaded already @@ -89,7 +89,7 @@ do if oldminor and oldminor < 29 and AceGUI.objPools then AceGUI.objPools = nil end - + AceGUI.objPools = AceGUI.objPools or {} local objPools = AceGUI.objPools --Returns a new instance, if none are available either returns a new table or calls the given contructor @@ -97,11 +97,11 @@ do if not WidgetRegistry[type] then error("Attempt to instantiate unknown widget type", 2) end - + if not objPools[type] then objPools[type] = {} end - + local newObj = next(objPools[type]) if not newObj then newObj = WidgetRegistry[type]() @@ -151,12 +151,12 @@ function AceGUI:Create(type) widget.OnAcquire = widget.Aquire widget.Aquire = nil end - + if rawget(widget, "Release") then - widget.OnRelease = rawget(widget, "Release") + widget.OnRelease = rawget(widget, "Release") widget.Release = nil end - + if widget.OnAcquire then widget:OnAcquire() else @@ -238,18 +238,18 @@ end --[[ Widgets must provide the following functions OnAcquire() - Called when the object is acquired, should set everything to a default hidden state - + And the following members frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes type - the type of the object, same as the name given to :RegisterWidget() - + Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet It will be cleared automatically when a widget is released Placing values directly into a widget object should be avoided - + If the Widget can act as a container for other Widgets the following content - frame or derivitive that children will be anchored to - + The Widget can supply the following Optional Members :OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data :OnWidthSet(width) - Called when the width of the widget is changed @@ -265,21 +265,21 @@ end -- Widget Base Template -- -------------------------- do - local WidgetBase = AceGUI.WidgetBase - + local WidgetBase = AceGUI.WidgetBase + WidgetBase.SetParent = function(self, parent) local frame = self.frame frame:SetParent(nil) frame:SetParent(parent.content) self.parent = parent end - + WidgetBase.SetCallback = function(self, name, func) if type(func) == "function" then self.events[name] = func end end - + WidgetBase.Fire = function(self, name, ...) if self.events[name] then local success, ret = safecall(self.events[name], self, name, ...) @@ -288,7 +288,7 @@ do end end end - + WidgetBase.SetWidth = function(self, width) self.frame:SetWidth(width) self.frame.width = width @@ -296,7 +296,7 @@ do self:OnWidthSet(width) end end - + WidgetBase.SetRelativeWidth = function(self, width) if width <= 0 or width > 1 then error(":SetRelativeWidth(width): Invalid relative width.", 2) @@ -304,7 +304,7 @@ do self.relWidth = width self.width = "relative" end - + WidgetBase.SetHeight = function(self, height) self.frame:SetHeight(height) self.frame.height = height @@ -312,7 +312,7 @@ do self:OnHeightSet(height) end end - + --[[ WidgetBase.SetRelativeHeight = function(self, height) if height <= 0 or height > 1 then error(":SetRelativeHeight(height): Invalid relative height.", 2) @@ -324,47 +324,47 @@ do WidgetBase.IsVisible = function(self) return self.frame:IsVisible() end - + WidgetBase.IsShown= function(self) return self.frame:IsShown() end - + WidgetBase.Release = function(self) AceGUI:Release(self) end - + WidgetBase.SetPoint = function(self, ...) return self.frame:SetPoint(...) end - + WidgetBase.ClearAllPoints = function(self) return self.frame:ClearAllPoints() end - + WidgetBase.GetNumPoints = function(self) return self.frame:GetNumPoints() end - + WidgetBase.GetPoint = function(self, ...) return self.frame:GetPoint(...) - end - + end + WidgetBase.GetUserDataTable = function(self) return self.userdata end - + WidgetBase.SetUserData = function(self, key, value) self.userdata[key] = value end - + WidgetBase.GetUserData = function(self, key) return self.userdata[key] end - + WidgetBase.IsFullHeight = function(self) return self.height == "fill" end - + WidgetBase.SetFullHeight = function(self, isFull) if isFull then self.height = "fill" @@ -372,11 +372,11 @@ do self.height = nil end end - + WidgetBase.IsFullWidth = function(self) return self.width == "fill" end - + WidgetBase.SetFullWidth = function(self, isFull) if isFull then self.width = "fill" @@ -384,29 +384,29 @@ do self.width = nil end end - + -- local function LayoutOnUpdate(this) -- this:SetScript("OnUpdate",nil) -- this.obj:PerformLayout() -- end - + local WidgetContainerBase = AceGUI.WidgetContainerBase - + WidgetContainerBase.PauseLayout = function(self) self.LayoutPaused = true end - + WidgetContainerBase.ResumeLayout = function(self) self.LayoutPaused = nil end - + WidgetContainerBase.PerformLayout = function(self) if self.LayoutPaused then return end safecall(self.LayoutFunc, self.content, self.children) end - + --call this function to layout, makes sure layed out objects get a frame to get sizes etc WidgetContainerBase.DoLayout = function(self) self:PerformLayout() @@ -414,7 +414,7 @@ do -- self.frame:SetScript("OnUpdate", LayoutOnUpdate) -- end end - + WidgetContainerBase.AddChild = function(self, child, beforeWidget) if beforeWidget then local siblingIndex = 1 @@ -422,7 +422,7 @@ do if widget == beforeWidget then break end - siblingIndex = siblingIndex + 1 + siblingIndex = siblingIndex + 1 end tinsert(self.children, siblingIndex, child) else @@ -432,7 +432,7 @@ do child.frame:Show() self:DoLayout() end - + WidgetContainerBase.AddChildren = function(self, ...) for i = 1, select("#", ...) do local child = select(i, ...) @@ -442,7 +442,7 @@ do end self:DoLayout() end - + WidgetContainerBase.ReleaseChildren = function(self) local children = self.children for i = 1,#children do @@ -450,7 +450,7 @@ do children[i] = nil end end - + WidgetContainerBase.SetLayout = function(self, Layout) self.LayoutFunc = AceGUI:GetLayout(Layout) end @@ -474,7 +474,7 @@ do end end end - + local function ContentResize(this) if this:GetWidth() and this:GetHeight() then this.width = this:GetWidth() @@ -486,7 +486,7 @@ do setmetatable(WidgetContainerBase, {__index=WidgetBase}) --One of these function should be called on each Widget Instance as part of its creation process - + --- Register a widget-class as a container for newly created widgets. -- @param widget The widget class function AceGUI:RegisterAsContainer(widget) @@ -502,7 +502,7 @@ do widget:SetLayout("List") return widget end - + --- Register a widget-class as a widget. -- @param widget The widget class function AceGUI:RegisterAsWidget(widget) @@ -529,11 +529,11 @@ end -- @param Version The version of the widget function AceGUI:RegisterWidgetType(Name, Constructor, Version) assert(type(Constructor) == "function") - assert(type(Version) == "number") - + assert(type(Version) == "number") + local oldVersion = WidgetVersions[Name] if oldVersion and oldVersion >= Version then return end - + WidgetVersions[Name] = Version WidgetRegistry[Name] = Constructor end @@ -602,7 +602,7 @@ AceGUI:RegisterLayout("List", local width = content.width or content:GetWidth() or 0 for i = 1, #children do local child = children[i] - + local frame = child.frame frame:ClearAllPoints() frame:Show() @@ -611,22 +611,22 @@ AceGUI:RegisterLayout("List", else frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT") end - + if child.width == "fill" then child:SetWidth(width) frame:SetPoint("RIGHT", content) - + if child.DoLayout then child:DoLayout() end elseif child.width == "relative" then child:SetWidth(width * child.relWidth) - + if child.DoLayout then child:DoLayout() end end - + height = height + (frame.height or frame:GetHeight() or 0) end safecall(content.obj.LayoutFinished, content.obj, nil, height) @@ -661,17 +661,17 @@ AceGUI:RegisterLayout("Flow", --height of the current row local rowheight = 0 local rowoffset = 0 - + local width = content.width or content:GetWidth() or 0 - + --control at the start of the row local rowstart local rowstartoffset local isfullheight - + local frameoffset local lastframeoffset - local oversize + local oversize for i = 1, #children do local child = children[i] oversize = nil @@ -679,17 +679,17 @@ AceGUI:RegisterLayout("Flow", local frameheight = frame.height or frame:GetHeight() or 0 local framewidth = frame.width or frame:GetWidth() or 0 lastframeoffset = frameoffset - -- HACK: Why did we set a frameoffset of (frameheight / 2) ? + -- HACK: Why did we set a frameoffset of (frameheight / 2) ? -- That was moving all widgets half the widgets size down, is that intended? -- Actually, it seems to be neccessary for many cases, we'll leave it in for now. -- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them. -- TODO: Investigate moar! frameoffset = child.alignoffset or (frameheight / 2) - + if child.width == "relative" then framewidth = width * child.relWidth end - + frame:Show() frame:ClearAllPoints() if i == 1 then @@ -728,11 +728,11 @@ AceGUI:RegisterLayout("Flow", else --handles cases where the new height is higher than either control because of the offsets --math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset) - + --offset is always the larger of the two offsets rowoffset = math_max(rowoffset, frameoffset) rowheight = math_max(rowheight, rowoffset + (frameheight / 2)) - + frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset) usedwidth = framewidth + usedwidth end @@ -741,11 +741,11 @@ AceGUI:RegisterLayout("Flow", if child.width == "fill" then safelayoutcall(child, "SetWidth", width) frame:SetPoint("RIGHT", content) - + usedwidth = 0 rowstart = frame rowstartoffset = frameoffset - + if child.DoLayout then child:DoLayout() end @@ -754,7 +754,7 @@ AceGUI:RegisterLayout("Flow", rowstartoffset = rowoffset elseif child.width == "relative" then safelayoutcall(child, "SetWidth", width * child.relWidth) - + if child.DoLayout then child:DoLayout() end @@ -763,20 +763,20 @@ AceGUI:RegisterLayout("Flow", frame:SetPoint("RIGHT", content) end end - + if child.height == "fill" then frame:SetPoint("BOTTOM", content) isfullheight = true end end - + --anchor the last row, if its full height needs a special case since its height has just been changed by the anchor if isfullheight then rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height) elseif rowstart then rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3)) end - + height = height + rowheight + 3 safecall(content.obj.LayoutFinished, content.obj, nil, height) end) @@ -840,7 +840,7 @@ AceGUI:RegisterLayout("Table", local spaceH = tableObj.spaceH or tableObj.space or 0 local spaceV = tableObj.spaceV or tableObj.space or 0 local totalH = (content:GetWidth() or content.width or 0) - spaceH * (#cols - 1) - + -- We need to reuse these because layout events can come in very frequently local layoutCache = obj:GetUserData("layoutCache") if not layoutCache then @@ -848,7 +848,7 @@ AceGUI:RegisterLayout("Table", obj:SetUserData("layoutCache", layoutCache) end local t, laneH, laneV, rowspans, rowStart, colStart = unpack(layoutCache) - + -- Create the grid local n, slotFound = 0 for i,child in ipairs(children) do @@ -913,7 +913,7 @@ AceGUI:RegisterLayout("Table", local f = child.frame f:ClearAllPoints() local childH = f:GetWidth() or 0 - + laneH[col] = max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH)) end end @@ -947,7 +947,7 @@ AceGUI:RegisterLayout("Table", local cellObj = child:GetUserData("cell") local offsetH = GetCellDimension("H", laneH, 1, colStart[child] - 1, spaceH) + (colStart[child] == 1 and 0 or spaceH) local cellH = GetCellDimension("H", laneH, colStart[child], col, spaceH) - + local f = child.frame f:ClearAllPoints() local childH = f:GetWidth() or 0 @@ -957,7 +957,7 @@ AceGUI:RegisterLayout("Table", if child:IsFullWidth() or alignFn == "fill" or childH > cellH then f:SetPoint("RIGHT", content, "LEFT", offsetH + align + cellH, 0) end - + if child.DoLayout then child:DoLayout() end @@ -976,7 +976,7 @@ AceGUI:RegisterLayout("Table", local cellObj = child:GetUserData("cell") local offsetV = GetCellDimension("V", laneV, 1, rowStart[child] - 1, spaceV) + (rowStart[child] == 1 and 0 or spaceV) local cellV = GetCellDimension("V", laneV, rowStart[child], row, spaceV) - + local f = child.frame local childV = f:GetHeight() or 0 @@ -991,7 +991,7 @@ AceGUI:RegisterLayout("Table", -- Calculate total height local totalV = GetCellDimension("V", laneV, 1, #laneV, spaceV) - + -- Cleanup for _,v in pairs(layoutCache) do wipe(v) end diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua index b0f81b7..4b09d64 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua @@ -150,7 +150,7 @@ local function Constructor() widget[method] = func end dropdown.parentgroup = widget - + return AceGUI:RegisterAsContainer(widget) end diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua index eb8e215..d110d03 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua @@ -40,7 +40,7 @@ end Methods -------------------------------------------------------------------------------]] local methods = { - ["OnAcquire"] = function(self) + ["OnAcquire"] = function(self) self:SetScroll(0) self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate) end, @@ -77,7 +77,7 @@ local methods = { ["MoveScroll"] = function(self, value) local status = self.status or self.localstatus local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight() - + if self.scrollBarShown then local diff = height - viewheight local delta = 1 diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua index 9129f9d..053e27d 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua @@ -161,21 +161,21 @@ local methods = { self.tablist = tabs self:BuildTabs() end, - + ["BuildTabs"] = function(self) local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "") local tablist = self.tablist local tabs = self.tabs - + if not tablist then return end - + local width = self.frame.width or self.frame:GetWidth() or 0 - + wipe(widths) wipe(rowwidths) wipe(rowends) - + --Place Text into tabs and get thier initial width for i, v in ipairs(tablist) do local tab = tabs[i] @@ -183,19 +183,19 @@ local methods = { tab = self:CreateTab(i) tabs[i] = tab end - + tab:Show() tab:SetText(v.text) tab:SetDisabled(v.disabled) tab.value = v.value - + widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text end - + for i = (#tablist)+1, #tabs, 1 do tabs[i]:Hide() end - + --First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout local numtabs = #tablist local numrows = 1 @@ -213,7 +213,7 @@ local methods = { end rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px rowends[numrows] = #tablist - + --Fix for single tabs being left on the last row, move a tab from the row above if applicable if numrows > 1 then --if the last row has only one tab @@ -244,22 +244,22 @@ local methods = { tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0) end end - + -- equal padding for each tab to fill the available width, -- if the used space is above 75% already - -- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame, + -- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame, -- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't local padding = 0 if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then padding = (width - rowwidths[row]) / (endtab - starttab+1) end - + for i = starttab, endtab do PanelTemplates_TabResize(tabs[i], padding + 4, nil, nil, width, tabs[i]:GetFontString():GetStringWidth()) end starttab = endtab + 1 end - + self.borderoffset = (hastitle and 17 or 10)+((numrows)*20) self.border:SetPoint("TOPLEFT", 1, -self.borderoffset) end, @@ -285,7 +285,7 @@ local methods = { content:SetHeight(contentheight) content.height = contentheight end, - + ["LayoutFinished"] = function(self, width, height) if self.noAutoHeight then return end self:SetHeight((height or 0) + (self.borderoffset + 23)) @@ -342,7 +342,7 @@ local function Constructor() for method, func in pairs(methods) do widget[method] = func end - + return AceGUI:RegisterAsContainer(widget) end diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua index ba916d0..3558edd 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua @@ -2,7 +2,7 @@ TreeGroup Container Container that uses a tree control to switch between groups. -------------------------------------------------------------------------------]] -local Type, Version = "TreeGroup", 41 +local Type, Version = "TreeGroup", 42 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end @@ -36,7 +36,7 @@ do function del(t) for k in pairs(t) do t[k] = nil - end + end pool[t] = true end end @@ -66,7 +66,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded) local value = treeline.value local uniquevalue = treeline.uniquevalue local disabled = treeline.disabled - + button.treeline = treeline button.value = value button.uniquevalue = uniquevalue @@ -87,7 +87,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded) button:SetHighlightFontObject("GameFontHighlightSmall") button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2) end - + if disabled then button:EnableMouse(false) button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE) @@ -95,20 +95,20 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded) button.text:SetText(text) button:EnableMouse(true) end - + if icon then button.icon:SetTexture(icon) button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1) else button.icon:SetTexture(nil) end - + if iconCoords then button.icon:SetTexCoord(unpack(iconCoords)) else button.icon:SetTexCoord(0, 1, 0, 1) end - + if canExpand then if not isExpanded then toggle:SetNormalTexture(130838) -- Interface\\Buttons\\UI-PlusButton-UP @@ -209,6 +209,7 @@ local function Button_OnEnter(frame) if self.enabletooltips then GameTooltip:SetOwner(frame, "ANCHOR_NONE") + GameTooltip:ClearAllPoints() GameTooltip:SetPoint("LEFT",frame,"RIGHT") GameTooltip:SetText(frame.text:GetText() or "", 1, .82, 0, true) @@ -275,10 +276,10 @@ local function Dragger_OnMouseUp(frame) treeframe:SetHeight(0) treeframe:SetPoint("TOPLEFT", frame, "TOPLEFT",0,0) treeframe:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0) - + local status = self.status or self.localstatus status.treewidth = treeframe:GetWidth() - + treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth()) -- recalculate the content width treeframe.obj:OnWidthSet(status.fullwidth) @@ -363,8 +364,8 @@ local methods = { --sets the tree to be displayed ["SetTree"] = function(self, tree, filter) self.filter = filter - if tree then - assert(type(tree) == "table") + if tree then + assert(type(tree) == "table") end self.tree = tree self:RefreshTree() @@ -372,7 +373,7 @@ local methods = { ["BuildLevel"] = function(self, tree, level, parent) local groups = (self.status or self.localstatus).groups - + for i, v in ipairs(tree) do if v.children then if not self.filter or ShouldDisplayLevel(v.children) then @@ -409,7 +410,7 @@ local methods = { local tree = self.tree local treeframe = self.treeframe - + status.scrollToSelection = status.scrollToSelection or scrollToSelection -- needs to be cached in case the control hasn't been drawn yet (code bails out below) self:BuildLevel(tree, 1) @@ -426,7 +427,7 @@ local methods = { end local first, last - + scrollToSelection = status.scrollToSelection status.scrollToSelection = nil @@ -502,9 +503,9 @@ local methods = { button:Show() buttonnum = buttonnum + 1 end - + end, - + ["SetSelected"] = function(self, value) local status = self.status or self.localstatus if status.selected ~= value then @@ -554,16 +555,16 @@ local methods = { local treeframe = self.treeframe local status = self.status or self.localstatus status.fullwidth = width - + local contentwidth = width - status.treewidth - 20 if contentwidth < 0 then contentwidth = 0 end content:SetWidth(contentwidth) content.width = contentwidth - + local maxtreewidth = math_min(400, width - 50) - + if maxtreewidth > 100 and status.treewidth > maxtreewidth then self:SetTreeWidth(maxtreewidth, status.treesizable) end @@ -589,16 +590,16 @@ local methods = { treewidth = DEFAULT_TREE_WIDTH else resizable = false - treewidth = DEFAULT_TREE_WIDTH + treewidth = DEFAULT_TREE_WIDTH end end self.treeframe:SetWidth(treewidth) self.dragger:EnableMouse(resizable) - + local status = self.status or self.localstatus status.treewidth = treewidth status.treesizable = resizable - + -- recalculate the content width if status.fullwidth then self:OnWidthSet(status.fullwidth) diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua index 9818e6d..2e28a3d 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua @@ -30,21 +30,21 @@ do local function frameOnClose(this) this.obj:Fire("OnClose") end - + local function closeOnClick(this) PlaySound(799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT this.obj:Hide() end - + local function frameOnMouseDown(this) AceGUI:ClearFocus() end - + local function titleOnMouseDown(this) this:GetParent():StartMoving() AceGUI:ClearFocus() end - + local function frameOnMouseUp(this) local frame = this:GetParent() frame:StopMovingOrSizing() @@ -55,22 +55,22 @@ do status.top = frame:GetTop() status.left = frame:GetLeft() end - + local function sizerseOnMouseDown(this) this:GetParent():StartSizing("BOTTOMRIGHT") AceGUI:ClearFocus() end - + local function sizersOnMouseDown(this) this:GetParent():StartSizing("BOTTOM") AceGUI:ClearFocus() end - + local function sizereOnMouseDown(this) this:GetParent():StartSizing("RIGHT") AceGUI:ClearFocus() end - + local function sizerOnMouseUp(this) this:GetParent():StopMovingOrSizing() end @@ -78,19 +78,19 @@ do local function SetTitle(self,title) self.titletext:SetText(title) end - + local function SetStatusText(self,text) -- self.statustext:SetText(text) end - + local function Hide(self) self.frame:Hide() end - + local function Show(self) self.frame:Show() end - + local function OnAcquire(self) self.frame:SetParent(UIParent) self.frame:SetFrameStrata("FULLSCREEN_DIALOG") @@ -98,21 +98,21 @@ do self:EnableResize(true) self:Show() end - + local function OnRelease(self) self.status = nil for k in pairs(self.localstatus) do self.localstatus[k] = nil end end - + -- called to set an external table to store status in local function SetStatusTable(self, status) assert(type(status) == "table") self.status = status self:ApplyStatus() end - + local function ApplyStatus(self) local status = self.status or self.localstatus local frame = self.frame @@ -125,7 +125,7 @@ do frame:SetPoint("CENTER",UIParent,"CENTER") end end - + local function OnWidthSet(self, width) local content = self.content local contentwidth = width - 34 @@ -135,8 +135,8 @@ do content:SetWidth(contentwidth) content.width = contentwidth end - - + + local function OnHeightSet(self, height) local content = self.content local contentheight = height - 57 @@ -146,19 +146,19 @@ do content:SetHeight(contentheight) content.height = contentheight end - + local function EnableResize(self, state) local func = state and "Show" or "Hide" self.sizer_se[func](self.sizer_se) self.sizer_s[func](self.sizer_s) self.sizer_e[func](self.sizer_e) end - + local function Constructor() local frame = CreateFrame("Frame",nil,UIParent) local self = {} self.type = "Window" - + self.Hide = Hide self.Show = Show self.SetTitle = SetTitle @@ -170,9 +170,9 @@ do self.OnWidthSet = OnWidthSet self.OnHeightSet = OnHeightSet self.EnableResize = EnableResize - + self.localstatus = {} - + self.frame = frame frame.obj = self frame:SetWidth(700) @@ -183,7 +183,7 @@ do frame:SetResizable(true) frame:SetFrameStrata("FULLSCREEN_DIALOG") frame:SetScript("OnMouseDown", frameOnMouseDown) - + frame:SetScript("OnShow",frameOnShow) frame:SetScript("OnHide",frameOnClose) frame:SetMinResize(240,240) @@ -193,81 +193,81 @@ do titlebg:SetTexture(251966) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Title-Background titlebg:SetPoint("TOPLEFT", 9, -6) titlebg:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -28, -24) - + local dialogbg = frame:CreateTexture(nil, "BACKGROUND") dialogbg:SetTexture(137056) -- Interface\\Tooltips\\UI-Tooltip-Background dialogbg:SetPoint("TOPLEFT", 8, -24) dialogbg:SetPoint("BOTTOMRIGHT", -6, 8) dialogbg:SetVertexColor(0, 0, 0, .75) - + local topleft = frame:CreateTexture(nil, "BORDER") topleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border topleft:SetWidth(64) topleft:SetHeight(64) topleft:SetPoint("TOPLEFT") topleft:SetTexCoord(0.501953125, 0.625, 0, 1) - + local topright = frame:CreateTexture(nil, "BORDER") topright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border topright:SetWidth(64) topright:SetHeight(64) topright:SetPoint("TOPRIGHT") topright:SetTexCoord(0.625, 0.75, 0, 1) - + local top = frame:CreateTexture(nil, "BORDER") top:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border top:SetHeight(64) top:SetPoint("TOPLEFT", topleft, "TOPRIGHT") top:SetPoint("TOPRIGHT", topright, "TOPLEFT") top:SetTexCoord(0.25, 0.369140625, 0, 1) - + local bottomleft = frame:CreateTexture(nil, "BORDER") bottomleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border bottomleft:SetWidth(64) bottomleft:SetHeight(64) bottomleft:SetPoint("BOTTOMLEFT") bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1) - + local bottomright = frame:CreateTexture(nil, "BORDER") bottomright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border bottomright:SetWidth(64) bottomright:SetHeight(64) bottomright:SetPoint("BOTTOMRIGHT") bottomright:SetTexCoord(0.875, 1, 0, 1) - + local bottom = frame:CreateTexture(nil, "BORDER") bottom:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border bottom:SetHeight(64) bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT") bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT") bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1) - + local left = frame:CreateTexture(nil, "BORDER") left:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border left:SetWidth(64) left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT") left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT") left:SetTexCoord(0.001953125, 0.125, 0, 1) - + local right = frame:CreateTexture(nil, "BORDER") right:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border right:SetWidth(64) right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT") right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT") right:SetTexCoord(0.1171875, 0.2421875, 0, 1) - + local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton") close:SetPoint("TOPRIGHT", 2, 1) close:SetScript("OnClick", closeOnClick) self.closebutton = close close.obj = self - + local titletext = frame:CreateFontString(nil, "ARTWORK") titletext:SetFontObject(GameFontNormal) titletext:SetPoint("TOPLEFT", 12, -8) titletext:SetPoint("TOPRIGHT", -32, -8) self.titletext = titletext - + local title = CreateFrame("Button", nil, frame) title:SetPoint("TOPLEFT", titlebg) title:SetPoint("BOTTOMRIGHT", titlebg) @@ -275,7 +275,7 @@ do title:SetScript("OnMouseDown",titleOnMouseDown) title:SetScript("OnMouseUp", frameOnMouseUp) self.title = title - + local sizer_se = CreateFrame("Frame",nil,frame) sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0) sizer_se:SetWidth(25) @@ -311,7 +311,7 @@ do sizer_s:SetScript("OnMouseDown",sizersOnMouseDown) sizer_s:SetScript("OnMouseUp", sizerOnMouseUp) self.sizer_s = sizer_s - + local sizer_e = CreateFrame("Frame",nil,frame) sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25) sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0) @@ -320,17 +320,17 @@ do sizer_e:SetScript("OnMouseDown",sizereOnMouseDown) sizer_e:SetScript("OnMouseUp", sizerOnMouseUp) self.sizer_e = sizer_e - + --Container Support local content = CreateFrame("Frame",nil,frame) self.content = content content.obj = self content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32) content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13) - + AceGUI:RegisterAsContainer(self) - return self + return self end - + AceGUI:RegisterWidgetType(Type,Constructor,Version) end diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua index 0a23be4..0e286ca 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua @@ -51,7 +51,7 @@ local methods = { self:SetWidth(self.text:GetStringWidth() + 30) end end, - + ["SetAutoWidth"] = function(self, autoWidth) self.autoWidth = autoWidth if self.autoWidth then diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua index be9ae81..53ef618 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua @@ -221,11 +221,11 @@ local methods = { self:SetHeight(24) end end, - + ["SetImage"] = function(self, path, ...) local image = self.image image:SetTexture(path) - + if image:GetTexture() then local n = select("#", ...) if n == 4 or n == 8 then diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua index 4e911db..1101162 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua @@ -1,7 +1,7 @@ --[[----------------------------------------------------------------------------- ColorPicker Widget -------------------------------------------------------------------------------]] -local Type, Version = "ColorPicker", 24 +local Type, Version = "ColorPicker", 25 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end @@ -13,7 +13,7 @@ local CreateFrame, UIParent = CreateFrame, UIParent -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded -- List them here for Mikk's FindGlobals script --- GLOBALS: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame +-- GLOBALS: ColorPickerFrame, OpacitySliderFrame --[[----------------------------------------------------------------------------- Support functions @@ -47,7 +47,7 @@ local function Control_OnLeave(frame) end local function ColorSwatch_OnClick(frame) - HideUIPanel(ColorPickerFrame) + ColorPickerFrame:Hide() local self = frame.obj if not self.disabled then ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG") @@ -77,7 +77,7 @@ local function ColorSwatch_OnClick(frame) ColorCallback(self, r, g, b, a, true) end - ShowUIPanel(ColorPickerFrame) + ColorPickerFrame:Show() end AceGUI:ClearFocus() end diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua index 549ce3e..7ae1401 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua @@ -1,4 +1,4 @@ ---[[ $Id: AceGUIWidget-DropDown-Items.lua 1192 2018-07-30 18:03:51Z funkydude $ ]]-- +--[[ $Id: AceGUIWidget-DropDown-Items.lua 1202 2019-05-15 23:11:22Z nevcairiel $ ]]-- local AceGUI = LibStub("AceGUI-3.0") @@ -33,7 +33,7 @@ end -- ItemBase is the base "class" for all dropdown items. -- Each item has to use ItemBase.Create(widgetType) to --- create an initial 'self' value. +-- create an initial 'self' value. -- ItemBase will add common functions and ui event handlers. -- Be sure to keep basic usage when you override functions. @@ -52,7 +52,7 @@ function ItemBase.Frame_OnEnter(this) self.highlight:Show() end self:Fire("OnEnter") - + if self.specialOnEnter then self.specialOnEnter(self) end @@ -60,10 +60,10 @@ end function ItemBase.Frame_OnLeave(this) local self = this.obj - + self.highlight:Hide() self:Fire("OnLeave") - + if self.specialOnLeave then self.specialOnLeave(self) end @@ -89,7 +89,7 @@ end -- Do not call this method directly function ItemBase.SetPullout(self, pullout) self.pullout = pullout - + self.frame:SetParent(nil) self.frame:SetParent(pullout.itemFrame) self.parent = pullout.itemFrame @@ -155,12 +155,12 @@ function ItemBase.Create(type) self.frame = frame frame.obj = self self.type = type - + self.useHighlight = true - + frame:SetHeight(17) frame:SetFrameStrata("FULLSCREEN_DIALOG") - + local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") text:SetTextColor(1,1,1) text:SetJustifyH("LEFT") @@ -178,7 +178,7 @@ function ItemBase.Create(type) highlight:Hide() self.highlight = highlight - local check = frame:CreateTexture("OVERLAY") + local check = frame:CreateTexture("OVERLAY") check:SetWidth(16) check:SetHeight(16) check:SetPoint("LEFT",frame,"LEFT",3,-1) @@ -192,26 +192,26 @@ function ItemBase.Create(type) sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1) sub:SetTexture(130940) -- Interface\\ChatFrame\\ChatFrameExpandArrow sub:Hide() - self.sub = sub - + self.sub = sub + frame:SetScript("OnEnter", ItemBase.Frame_OnEnter) frame:SetScript("OnLeave", ItemBase.Frame_OnLeave) - + self.OnAcquire = ItemBase.OnAcquire self.OnRelease = ItemBase.OnRelease - + self.SetPullout = ItemBase.SetPullout self.GetText = ItemBase.GetText self.SetText = ItemBase.SetText self.SetDisabled = ItemBase.SetDisabled - + self.SetPoint = ItemBase.SetPoint self.Show = ItemBase.Show self.Hide = ItemBase.Hide - + self.SetOnLeave = ItemBase.SetOnLeave self.SetOnEnter = ItemBase.SetOnEnter - + return self end @@ -223,20 +223,20 @@ end --[[ Template for items: - + -- Item: -- do local widgetType = "Dropdown-Item-" local widgetVersion = 1 - + local function Constructor() local self = ItemBase.Create(widgetType) - + AceGUI:RegisterAsWidget(self) return self end - + AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) end --]] @@ -247,25 +247,25 @@ end do local widgetType = "Dropdown-Item-Header" local widgetVersion = 1 - + local function OnEnter(this) local self = this.obj self:Fire("OnEnter") - + if self.specialOnEnter then self.specialOnEnter(self) end end - + local function OnLeave(this) local self = this.obj self:Fire("OnLeave") - + if self.specialOnLeave then self.specialOnLeave(self) end end - + -- exported, override local function SetDisabled(self, disabled) ItemBase.SetDisabled(self, disabled) @@ -273,21 +273,21 @@ do self.text:SetTextColor(1, 1, 0) end end - + local function Constructor() local self = ItemBase.Create(widgetType) - + self.SetDisabled = SetDisabled - + self.frame:SetScript("OnEnter", OnEnter) self.frame:SetScript("OnLeave", OnLeave) - + self.text:SetTextColor(1, 1, 0) - + AceGUI:RegisterAsWidget(self) return self end - + AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) end @@ -296,7 +296,7 @@ end do local widgetType = "Dropdown-Item-Execute" local widgetVersion = 1 - + local function Frame_OnClick(this, button) local self = this.obj if self.disabled then return end @@ -305,16 +305,16 @@ do self.pullout:Close() end end - + local function Constructor() local self = ItemBase.Create(widgetType) - + self.frame:SetScript("OnClick", Frame_OnClick) - + AceGUI:RegisterAsWidget(self) return self end - + AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) end @@ -324,7 +324,7 @@ end do local widgetType = "Dropdown-Item-Toggle" local widgetVersion = 4 - + local function UpdateToggle(self) if self.value then self.check:Show() @@ -332,12 +332,12 @@ do self.check:Hide() end end - + local function OnRelease(self) ItemBase.OnRelease(self) self:SetValue(nil) end - + local function Frame_OnClick(this, button) local self = this.obj if self.disabled then return end @@ -350,31 +350,31 @@ do UpdateToggle(self) self:Fire("OnValueChanged", self.value) end - + -- exported local function SetValue(self, value) self.value = value UpdateToggle(self) end - + -- exported local function GetValue(self) return self.value end - + local function Constructor() local self = ItemBase.Create(widgetType) - + self.frame:SetScript("OnClick", Frame_OnClick) - + self.SetValue = SetValue self.GetValue = GetValue self.OnRelease = OnRelease - + AceGUI:RegisterAsWidget(self) return self end - + AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) end @@ -384,55 +384,55 @@ end do local widgetType = "Dropdown-Item-Menu" local widgetVersion = 2 - + local function OnEnter(this) local self = this.obj self:Fire("OnEnter") - + if self.specialOnEnter then self.specialOnEnter(self) end - + self.highlight:Show() - + if not self.disabled and self.submenu then self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100) end end - + local function OnHide(this) local self = this.obj if self.submenu then self.submenu:Close() end end - + -- exported local function SetMenu(self, menu) assert(menu.type == "Dropdown-Pullout") self.submenu = menu end - + -- exported local function CloseMenu(self) self.submenu:Close() end - + local function Constructor() local self = ItemBase.Create(widgetType) - + self.sub:Show() - + self.frame:SetScript("OnEnter", OnEnter) self.frame:SetScript("OnHide", OnHide) - + self.SetMenu = SetMenu self.CloseMenu = CloseMenu - + AceGUI:RegisterAsWidget(self) return self end - + AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) end @@ -441,31 +441,31 @@ end do local widgetType = "Dropdown-Item-Separator" local widgetVersion = 2 - + -- exported, override local function SetDisabled(self, disabled) ItemBase.SetDisabled(self, disabled) self.useHighlight = false end - + local function Constructor() local self = ItemBase.Create(widgetType) - + self.SetDisabled = SetDisabled - + local line = self.frame:CreateTexture(nil, "OVERLAY") line:SetHeight(1) line:SetColorTexture(.5, .5, .5) line:SetPoint("LEFT", self.frame, "LEFT", 10, 0) line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0) - + self.text:Hide() - + self.useHighlight = false - + AceGUI:RegisterAsWidget(self) return self end - + AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version) end diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua index cf0b0aa..0d6308f 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua @@ -1,9 +1,9 @@ ---[[ $Id: AceGUIWidget-DropDown.lua 1167 2017-08-29 22:08:48Z funkydude $ ]]-- +--[[ $Id: AceGUIWidget-DropDown.lua 1209 2019-06-24 21:01:01Z nevcairiel $ ]]-- local AceGUI = LibStub("AceGUI-3.0") -- Lua APIs local min, max, floor = math.min, math.max, math.floor -local select, pairs, ipairs, type = select, pairs, ipairs, type +local select, pairs, ipairs, type, tostring = select, pairs, ipairs, type, tostring local tsort = table.sort -- WoW APIs @@ -40,9 +40,9 @@ end do local widgetType = "Dropdown-Pullout" local widgetVersion = 3 - + --[[ Static data ]]-- - + local backdrop = { bgFile = "Interface\\ChatFrame\\ChatFrameBackground", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", @@ -60,9 +60,9 @@ do local defaultWidth = 200 local defaultMaxHeight = 600 - + --[[ UI Event Handlers ]]-- - + -- HACK: This should be no part of the pullout, but there -- is no other 'clean' way to response to any item-OnEnter -- Used to close Submenus when an other item is entered @@ -74,22 +74,22 @@ do end end end - + -- See the note in Constructor() for each scroll related function local function OnMouseWheel(this, value) this.obj:MoveScroll(value) end - + local function OnScrollValueChanged(this, value) this.obj:SetScroll(value) end - + local function OnSizeChanged(this) this.obj:FixScroll() end - + --[[ Exported methods ]]-- - + -- exported local function SetScroll(self, value) local status = self.scrollStatus @@ -106,9 +106,9 @@ do child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset) child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset) status.offset = offset - status.scrollvalue = value + status.scrollvalue = value end - + -- exported local function MoveScroll(self, value) local status = self.scrollStatus @@ -127,7 +127,7 @@ do self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000)) end end - + -- exported local function FixScroll(self) local status = self.scrollStatus @@ -140,7 +140,7 @@ do child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset) self.slider:SetValue(0) else - self.slider:Show() + self.slider:Show() local value = (offset / (viewheight - height) * 1000) if value > 1000 then value = 1000 end self.slider:SetValue(value) @@ -153,44 +153,44 @@ do end end end - + -- exported, AceGUI callback local function OnAcquire(self) self.frame:SetParent(UIParent) --self.itemFrame:SetToplevel(true) end - + -- exported, AceGUI callback local function OnRelease(self) self:Clear() self.frame:ClearAllPoints() self.frame:Hide() end - + -- exported local function AddItem(self, item) self.items[#self.items + 1] = item - + local h = #self.items * 16 self.itemFrame:SetHeight(h) self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement - + item.frame:SetPoint("LEFT", self.itemFrame, "LEFT") item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT") - + item:SetPullout(self) item:SetOnEnter(OnEnter) end - + -- exported - local function Open(self, point, relFrame, relPoint, x, y) + local function Open(self, point, relFrame, relPoint, x, y) local items = self.items local frame = self.frame local itemFrame = self.itemFrame - + frame:SetPoint(point, relFrame, relPoint, x, y) - + local height = 8 for i, item in pairs(items) do if i == 1 then @@ -198,23 +198,23 @@ do else item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1) end - + item:Show() - + height = height + 16 end itemFrame:SetHeight(height) fixstrata("TOOLTIP", frame, frame:GetChildren()) frame:Show() self:Fire("OnOpen") - end - + end + -- exported local function Close(self) self.frame:Hide() self:Fire("OnClose") - end - + end + -- exported local function Clear(self) local items = self.items @@ -222,18 +222,18 @@ do AceGUI:Release(item) items[i] = nil end - end - + end + -- exported local function IterateItems(self) return ipairs(self.items) end - + -- exported local function SetHideOnLeave(self, val) self.hideOnLeave = val end - + -- exported local function SetMaxHeight(self, height) self.maxHeight = height or defaultMaxHeight @@ -243,19 +243,19 @@ do self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem end end - + -- exported local function GetRightBorderWidth(self) return 6 + (self.slider:IsShown() and 12 or 0) end - + -- exported local function GetLeftBorderWidth(self) return 6 end - + --[[ Constructor ]]-- - + local function Constructor() local count = AceGUI:GetNextWidgetNum(widgetType) local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent) @@ -264,7 +264,7 @@ do self.type = widgetType self.frame = frame frame.obj = self - + self.OnAcquire = OnAcquire self.OnRelease = OnRelease @@ -278,37 +278,37 @@ do self.SetScroll = SetScroll self.MoveScroll = MoveScroll self.FixScroll = FixScroll - + self.SetMaxHeight = SetMaxHeight self.GetRightBorderWidth = GetRightBorderWidth self.GetLeftBorderWidth = GetLeftBorderWidth - + self.items = {} - + self.scrollStatus = { scrollvalue = 0, } - + self.maxHeight = defaultMaxHeight - + frame:SetBackdrop(backdrop) frame:SetBackdropColor(0, 0, 0) frame:SetFrameStrata("FULLSCREEN_DIALOG") frame:SetClampedToScreen(true) frame:SetWidth(defaultWidth) - frame:SetHeight(self.maxHeight) + frame:SetHeight(self.maxHeight) --frame:SetToplevel(true) - + -- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame local scrollFrame = CreateFrame("ScrollFrame", nil, frame) local itemFrame = CreateFrame("Frame", nil, scrollFrame) - + self.scrollFrame = scrollFrame self.itemFrame = itemFrame - + scrollFrame.obj = self itemFrame.obj = self - + local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame) slider:SetOrientation("VERTICAL") slider:SetHitRectInsets(0, 0, -10, 0) @@ -318,7 +318,7 @@ do slider:SetFrameStrata("FULLSCREEN_DIALOG") self.slider = slider slider.obj = self - + scrollFrame:SetScrollChild(itemFrame) scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12) scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12) @@ -327,46 +327,46 @@ do scrollFrame:SetScript("OnSizeChanged", OnSizeChanged) scrollFrame:SetToplevel(true) scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG") - + itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0) itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0) itemFrame:SetHeight(400) itemFrame:SetToplevel(true) itemFrame:SetFrameStrata("FULLSCREEN_DIALOG") - + slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0) slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0) slider:SetScript("OnValueChanged", OnScrollValueChanged) slider:SetMinMaxValues(0, 1000) slider:SetValueStep(1) slider:SetValue(0) - + scrollFrame:Show() itemFrame:Show() slider:Hide() - + self:FixScroll() - + AceGUI:RegisterAsWidget(self) return self end - + AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) end do local widgetType = "Dropdown" - local widgetVersion = 31 - + local widgetVersion = 34 + --[[ Static data ]]-- - + --[[ UI event handler ]]-- - + local function Control_OnEnter(this) this.obj.button:LockHighlight() this.obj:Fire("OnEnter") end - + local function Control_OnLeave(this) this.obj.button:UnlockHighlight() this.obj:Fire("OnLeave") @@ -378,7 +378,7 @@ do self.pullout:Close() end end - + local function Dropdown_TogglePullout(this) local self = this.obj PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON @@ -393,17 +393,17 @@ do AceGUI:SetFocus(self) end end - + local function OnPulloutOpen(this) local self = this.userdata.obj local value = self.value - + if not self.multiselect then for i, item in this:IterateItems() do item:SetValue(item.userdata.value == value) end end - + self.open = true self:Fire("OnOpened") end @@ -413,7 +413,7 @@ do self.open = nil self:Fire("OnClosed") end - + local function ShowMultiText(self) local text for i, widget in self.pullout:IterateItems() do @@ -429,10 +429,10 @@ do end self:SetText(text) end - + local function OnItemValueChanged(this, event, checked) local self = this.userdata.obj - + if self.multiselect then self:Fire("OnValueChanged", this.userdata.value, checked) ShowMultiText(self) @@ -443,14 +443,14 @@ do else this:SetValue(true) end - if self.open then + if self.open then self.pullout:Close() end end end - + --[[ Exported methods ]]-- - + -- exported, AceGUI callback local function OnAcquire(self) local pullout = AceGUI:Create("Dropdown-Pullout") @@ -460,13 +460,13 @@ do pullout:SetCallback("OnOpen", OnPulloutOpen) self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1) fixlevels(self.pullout.frame, self.pullout.frame:GetChildren()) - + self:SetHeight(44) self:SetWidth(200) self:SetLabel() self:SetPulloutWidth(nil) end - + -- exported, AceGUI callback local function OnRelease(self) if self.open then @@ -474,20 +474,20 @@ do end AceGUI:Release(self.pullout) self.pullout = nil - + self:SetText("") self:SetDisabled(false) self:SetMultiselect(false) - + self.value = nil self.list = nil self.open = nil self.hasClose = nil - + self.frame:ClearAllPoints() self.frame:Hide() end - + -- exported local function SetDisabled(self, disabled) self.disabled = disabled @@ -503,19 +503,19 @@ do self.text:SetTextColor(1,1,1) end end - + -- exported local function ClearFocus(self) if self.open then self.pullout:Close() end end - + -- exported local function SetText(self, text) self.text:SetText(text or "") end - + -- exported local function SetLabel(self, text) if text and text ~= "" then @@ -532,7 +532,7 @@ do self.alignoffset = 12 end end - + -- exported local function SetValue(self, value) if self.list then @@ -540,12 +540,12 @@ do end self.value = value end - + -- exported local function GetValue(self) return self.value end - + -- exported local function SetItemValue(self, item, value) if not self.multiselect then return end @@ -558,7 +558,7 @@ do end ShowMultiText(self) end - + -- exported local function SetItemDisabled(self, item, disabled) for i, widget in self.pullout:IterateItems() do @@ -567,7 +567,7 @@ do end end end - + local function AddListItem(self, value, text, itemType) if not itemType then itemType = "Dropdown-Item-Toggle" end local exists = AceGUI:GetWidgetVersion(itemType) @@ -580,7 +580,7 @@ do item:SetCallback("OnValueChanged", OnItemValueChanged) self.pullout:AddItem(item) end - + local function AddCloseButton(self) if not self.hasClose then local close = AceGUI:Create("Dropdown-Item-Execute") @@ -589,21 +589,29 @@ do self.hasClose = true end end - + -- exported local sortlist = {} + local function sortTbl(x,y) + local num1, num2 = tonumber(x), tonumber(y) + if num1 and num2 then -- numeric comparison, either two numbers or numeric strings + return num1 < num2 + else -- compare everything else tostring'ed + return tostring(x) < tostring(y) + end + end local function SetList(self, list, order, itemType) self.list = list self.pullout:Clear() self.hasClose = nil if not list then return end - + if type(order) ~= "table" then for v in pairs(list) do sortlist[#sortlist + 1] = v end - tsort(sortlist) - + tsort(sortlist, sortTbl) + for i, key in ipairs(sortlist) do AddListItem(self, key, list[key], itemType) sortlist[i] = nil @@ -618,7 +626,7 @@ do AddCloseButton(self) end end - + -- exported local function AddItem(self, value, text, itemType) if self.list then @@ -626,7 +634,7 @@ do AddListItem(self, value, text, itemType) end end - + -- exported local function SetMultiselect(self, multi) self.multiselect = multi @@ -635,23 +643,23 @@ do AddCloseButton(self) end end - + -- exported local function GetMultiselect(self) return self.multiselect end - + local function SetPulloutWidth(self, width) self.pulloutWidth = width end - + --[[ Constructor ]]-- - + local function Constructor() local count = AceGUI:GetNextWidgetNum(widgetType) local frame = CreateFrame("Frame", nil, UIParent) local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate") - + local self = {} self.type = widgetType self.frame = frame @@ -659,10 +667,10 @@ do self.count = count frame.obj = self dropdown.obj = self - + self.OnRelease = OnRelease self.OnAcquire = OnAcquire - + self.ClearFocus = ClearFocus self.SetText = SetText @@ -677,9 +685,9 @@ do self.SetItemValue = SetItemValue self.SetItemDisabled = SetItemDisabled self.SetPulloutWidth = SetPulloutWidth - + self.alignoffset = 26 - + frame:SetScript("OnHide",Dropdown_OnHide) dropdown:ClearAllPoints() @@ -690,10 +698,10 @@ do local left = _G[dropdown:GetName() .. "Left"] local middle = _G[dropdown:GetName() .. "Middle"] local right = _G[dropdown:GetName() .. "Right"] - + middle:ClearAllPoints() right:ClearAllPoints() - + middle:SetPoint("LEFT", left, "RIGHT", 0, 0) middle:SetPoint("RIGHT", right, "LEFT", 0, 0) right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17) @@ -704,7 +712,7 @@ do button:SetScript("OnEnter",Control_OnEnter) button:SetScript("OnLeave",Control_OnLeave) button:SetScript("OnClick",Dropdown_TogglePullout) - + local button_cover = CreateFrame("BUTTON",nil,self.frame) self.button_cover = button_cover button_cover.obj = self @@ -713,14 +721,14 @@ do button_cover:SetScript("OnEnter",Control_OnEnter) button_cover:SetScript("OnLeave",Control_OnLeave) button_cover:SetScript("OnClick",Dropdown_TogglePullout) - + local text = _G[dropdown:GetName() .. "Text"] self.text = text text.obj = self text:ClearAllPoints() text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2) text:SetPoint("LEFT", left, "LEFT", 25, 2) - + local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall") label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0) label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0) @@ -732,6 +740,6 @@ do AceGUI:RegisterAsWidget(self) return self end - + AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion) -end +end diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua index bc3d02a..378e813 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua @@ -56,7 +56,7 @@ local methods = { ["SetImage"] = function(self, path, ...) local image = self.image image:SetTexture(path) - + if image:GetTexture() then local n = select("#", ...) if n == 4 or n == 8 then diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua index 7a754f6..eec999e 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua @@ -57,12 +57,12 @@ local function UpdateImageAnchor(self) label:SetWidth(width) height = label:GetStringHeight() end - + -- avoid zero-height labels, since they can used as spacers if not height or height == 0 then height = 1 end - + self.resizing = true frame:SetHeight(height) frame.height = height @@ -113,7 +113,7 @@ local methods = { ["SetImage"] = function(self, path, ...) local image = self.image image:SetTexture(path) - + if image:GetTexture() then self.imageshown = true local n = select("#", ...) diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua index 9af4b87..f702110 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua @@ -233,7 +233,7 @@ local methods = { end Layout(self) end, - + ["ClearFocus"] = function(self) self.editBox:ClearFocus() self.frame:SetScript("OnShow", nil) @@ -253,12 +253,12 @@ local methods = { ["GetCursorPosition"] = function(self) return self.editBox:GetCursorPosition() end, - + ["SetCursorPosition"] = function(self, ...) return self.editBox:SetCursorPosition(...) end, - - + + } --[[----------------------------------------------------------------------------- @@ -273,7 +273,7 @@ local backdrop = { local function Constructor() local frame = CreateFrame("Frame", nil, UIParent) frame:Hide() - + local widgetNum = AceGUI:GetNextWidgetNum(Type) local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") @@ -290,7 +290,7 @@ local function Constructor() button:SetText(ACCEPT) button:SetScript("OnClick", OnClick) button:Disable() - + local text = button:GetFontString() text:ClearAllPoints() text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5) @@ -339,7 +339,7 @@ local function Constructor() editBox:SetScript("OnTextChanged", OnTextChanged) editBox:SetScript("OnTextSet", OnTextSet) editBox:SetScript("OnEditFocusGained", OnEditFocusGained) - + scrollFrame:SetScrollChild(editBox) diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua index 5a81759..019c84e 100644 --- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua +++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua @@ -105,7 +105,7 @@ local function EditBox_OnEnterPressed(frame) else value = tonumber(value) end - + if value then PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON self.slider:SetValue(value) diff --git a/Libs/AceHook-3.0/AceHook-3.0.lua b/Libs/AceHook-3.0/AceHook-3.0.lua index 8302334..d91c36f 100644 --- a/Libs/AceHook-3.0/AceHook-3.0.lua +++ b/Libs/AceHook-3.0/AceHook-3.0.lua @@ -2,14 +2,14 @@ -- Using AceHook-3.0 is recommended when you need to unhook your hooks again, so the hook chain isn't broken -- when you manually restore the original function. -- --- **AceHook-3.0** can be embeded into your addon, either explicitly by calling AceHook:Embed(MyAddon) or by +-- **AceHook-3.0** can be embeded into your addon, either explicitly by calling AceHook:Embed(MyAddon) or by -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object -- and can be accessed directly, without having to explicitly call AceHook itself.\\ -- It is recommended to embed AceHook, otherwise you'll have to specify a custom `self` on all calls you -- make into AceHook. -- @class file -- @name AceHook-3.0 --- @release $Id: AceHook-3.0.lua 1118 2014-10-12 08:21:54Z nevcairiel $ +-- @release $Id: AceHook-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 8 local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR) @@ -117,14 +117,14 @@ function donothing() end function hook(self, obj, method, handler, script, secure, raw, forceSecure, usage) if not handler then handler = method end - + -- These asserts make sure AceHooks's devs play by the rules. assert(not script or type(script) == "boolean") assert(not secure or type(secure) == "boolean") assert(not raw or type(raw) == "boolean") assert(not forceSecure or type(forceSecure) == "boolean") assert(usage) - + -- Error checking Battery! if obj and type(obj) ~= "table" then error(format("%s: 'object' - nil or table expected got %s", usage, type(obj)), 3) @@ -146,8 +146,8 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag error(format("Cannot hook secure script %q; Use SecureHookScript(obj, method, [handler]) instead.", method), 3) end else - local issecure - if obj then + local issecure + if obj then issecure = onceSecure[obj] and onceSecure[obj][method] or issecurevariable(obj, method) else issecure = onceSecure[method] or issecurevariable(method) @@ -165,21 +165,21 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag end end end - + local uid if obj then uid = registry[self][obj] and registry[self][obj][method] else uid = registry[self][method] end - + if uid then if actives[uid] then -- Only two sane choices exist here. We either a) error 100% of the time or b) always unhook and then hook -- choice b would likely lead to odd debuging conditions or other mysteries so we're going with a. error(format("Attempting to rehook already active hook %s.", method)) end - + if handlers[uid] == handler then -- turn on a decative hook, note enclosures break this ability, small memory leak actives[uid] = true return @@ -197,7 +197,7 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag handlers[uid], actives[uid], scripts[uid] = nil, nil, nil uid = nil end - + local orig if script then orig = obj:GetScript(method) or donothing @@ -206,13 +206,13 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag else orig = _G[method] end - + if not orig then error(format("%s: Attempting to hook a non existing target", usage), 3) end - + uid = createHook(self, handler, orig, secure, not (raw or secure)) - + if obj then self.hooks[obj] = self.hooks[obj] or {} registry[self][obj] = registry[self][obj] or {} @@ -221,7 +221,7 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag if not secure then self.hooks[obj][method] = orig end - + if script then if not secure then obj:SetScript(method, uid) @@ -237,7 +237,7 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag end else registry[self][method] = uid - + if not secure then _G[method] = uid self.hooks[method] = orig @@ -245,8 +245,8 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag hooksecurefunc(method, uid) end end - - actives[uid], handlers[uid], scripts[uid] = true, handler, script and true or nil + + actives[uid], handlers[uid], scripts[uid] = true, handler, script and true or nil end --- Hook a function or a method on an object. @@ -262,7 +262,7 @@ end -- @usage -- -- create an addon with AceHook embeded -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0") --- +-- -- function MyAddon:OnEnable() -- -- Hook ActionButton_UpdateHotkeys, overwriting the secure status -- self:Hook("ActionButton_UpdateHotkeys", true) @@ -275,12 +275,12 @@ function AceHook:Hook(object, method, handler, hookSecure) if type(object) == "string" then method, handler, hookSecure, object = object, method, handler, nil end - + if handler == true then handler, hookSecure = nil, true end - hook(self, object, method, handler, false, false, false, hookSecure or false, "Usage: Hook([object], method, [handler], [hookSecure])") + hook(self, object, method, handler, false, false, false, hookSecure or false, "Usage: Hook([object], method, [handler], [hookSecure])") end --- RawHook a function or a method on an object. @@ -297,7 +297,7 @@ end -- @usage -- -- create an addon with AceHook embeded -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0") --- +-- -- function MyAddon:OnEnable() -- -- Hook ActionButton_UpdateHotkeys, overwriting the secure status -- self:RawHook("ActionButton_UpdateHotkeys", true) @@ -314,11 +314,11 @@ function AceHook:RawHook(object, method, handler, hookSecure) if type(object) == "string" then method, handler, hookSecure, object = object, method, handler, nil end - + if handler == true then handler, hookSecure = nil, true end - + hook(self, object, method, handler, false, false, true, hookSecure or false, "Usage: RawHook([object], method, [handler], [hookSecure])") end @@ -337,7 +337,7 @@ function AceHook:SecureHook(object, method, handler) if type(object) == "string" then method, handler, object = object, method, nil end - + hook(self, object, method, handler, false, true, false, false, "Usage: SecureHook([object], method, [handler])") end @@ -354,9 +354,9 @@ end -- @usage -- -- create an addon with AceHook embeded -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0") --- +-- -- function MyAddon:OnEnable() --- -- Hook the OnShow of FriendsFrame +-- -- Hook the OnShow of FriendsFrame -- self:HookScript(FriendsFrame, "OnShow", "FriendsFrameOnShow") -- end -- @@ -380,9 +380,9 @@ end -- @usage -- -- create an addon with AceHook embeded -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0") --- +-- -- function MyAddon:OnEnable() --- -- Hook the OnShow of FriendsFrame +-- -- Hook the OnShow of FriendsFrame -- self:RawHookScript(FriendsFrame, "OnShow", "FriendsFrameOnShow") -- end -- @@ -420,54 +420,54 @@ function AceHook:Unhook(obj, method) if type(obj) == "string" then method, obj = obj, nil end - + if obj and type(obj) ~= "table" then error(format("%s: 'obj' - expecting nil or table got %s", usage, type(obj)), 2) end if type(method) ~= "string" then error(format("%s: 'method' - expeting string got %s", usage, type(method)), 2) end - + local uid if obj then uid = registry[self][obj] and registry[self][obj][method] else uid = registry[self][method] end - + if not uid or not actives[uid] then -- Declining to error on an unneeded unhook since the end effect is the same and this would just be annoying. return false end - + actives[uid], handlers[uid] = nil, nil - + if obj then registry[self][obj][method] = nil registry[self][obj] = next(registry[self][obj]) and registry[self][obj] or nil - + -- if the hook reference doesnt exist, then its a secure hook, just bail out and dont do any unhooking if not self.hooks[obj] or not self.hooks[obj][method] then return true end - + if scripts[uid] and obj:GetScript(method) == uid then -- unhooks scripts - obj:SetScript(method, self.hooks[obj][method] ~= donothing and self.hooks[obj][method] or nil) + obj:SetScript(method, self.hooks[obj][method] ~= donothing and self.hooks[obj][method] or nil) scripts[uid] = nil elseif obj and self.hooks[obj] and self.hooks[obj][method] and obj[method] == uid then -- unhooks methods obj[method] = self.hooks[obj][method] end - + self.hooks[obj][method] = nil self.hooks[obj] = next(self.hooks[obj]) and self.hooks[obj] or nil else registry[self][method] = nil - + -- if self.hooks[method] doesn't exist, then this is a SecureHook, just bail out if not self.hooks[method] then return true end - + if self.hooks[method] and _G[method] == uid then -- unhooks functions _G[method] = self.hooks[method] end - + self.hooks[method] = nil end return true @@ -501,7 +501,7 @@ function AceHook:IsHooked(obj, method) return true, handlers[registry[self][obj][method]] end end - + return false, nil end diff --git a/Libs/AceSerializer-3.0/AceSerializer-3.0.lua b/Libs/AceSerializer-3.0/AceSerializer-3.0.lua index 0b19e08..2a4c5ef 100644 --- a/Libs/AceSerializer-3.0/AceSerializer-3.0.lua +++ b/Libs/AceSerializer-3.0/AceSerializer-3.0.lua @@ -1,16 +1,16 @@ --- **AceSerializer-3.0** can serialize any variable (except functions or userdata) into a string format, --- that can be send over the addon comm channel. AceSerializer was designed to keep all data intact, especially +-- that can be send over the addon comm channel. AceSerializer was designed to keep all data intact, especially -- very large numbers or floating point numbers, and table structures. The only caveat currently is, that multiple -- references to the same table will be send individually. -- --- **AceSerializer-3.0** can be embeded into your addon, either explicitly by calling AceSerializer:Embed(MyAddon) or by +-- **AceSerializer-3.0** can be embeded into your addon, either explicitly by calling AceSerializer:Embed(MyAddon) or by -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object -- and can be accessed directly, without having to explicitly call AceSerializer itself.\\ -- It is recommended to embed AceSerializer, otherwise you'll have to specify a custom `self` on all calls you -- make into AceSerializer. -- @class file -- @name AceSerializer-3.0 --- @release $Id: AceSerializer-3.0.lua 1135 2015-09-19 20:39:16Z nevcairiel $ +-- @release $Id: AceSerializer-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ local MAJOR,MINOR = "AceSerializer-3.0", 5 local AceSerializer, oldminor = LibStub:NewLibrary(MAJOR, MINOR) @@ -40,7 +40,7 @@ local function SerializeStringHelper(ch) -- Used by SerializeValue for strings return "\126\122" elseif n<=32 then -- nonprint + space return "\126"..strchar(n+64) - elseif n==94 then -- value separator + elseif n==94 then -- value separator return "\126\125" elseif n==126 then -- our own escape character return "\126\124" @@ -54,12 +54,12 @@ end local function SerializeValue(v, res, nres) -- We use "^" as a value separator, followed by one byte for type indicator local t=type(v) - + if t=="string" then -- ^S = string (escaped to remove nonprints, "^"s, etc) res[nres+1] = "^S" res[nres+2] = gsub(v,"[%c \94\126\127]", SerializeStringHelper) nres=nres+2 - + elseif t=="number" then -- ^N = number (just tostring()ed) or ^F (float components) local str = tostring(v) if tonumber(str)==v --[[not in 4.3 or str==serNaN]] then @@ -79,7 +79,7 @@ local function SerializeValue(v, res, nres) res[nres+4] = tostring(e-53) -- adjust exponent to counteract mantissa manipulation nres=nres+4 end - + elseif t=="table" then -- ^T...^t = table (list of key,value pairs) nres=nres+1 res[nres] = "^T" @@ -89,7 +89,7 @@ local function SerializeValue(v, res, nres) end nres=nres+1 res[nres] = "^t" - + elseif t=="boolean" then -- ^B = true, ^b = false nres=nres+1 if v then @@ -97,15 +97,15 @@ local function SerializeValue(v, res, nres) else res[nres] = "^b" -- false end - + elseif t=="nil" then -- ^Z = nil (zero, "N" was taken :P) nres=nres+1 res[nres] = "^Z" - + else error(MAJOR..": Cannot serialize a value of type '"..t.."'") -- can't produce error on right level, this is wildly recursive end - + return nres end @@ -121,14 +121,14 @@ local serializeTbl = { "^1" } -- "^1" = Hi, I'm data serialized by AceSerializer -- @return The data in its serialized form (string) function AceSerializer:Serialize(...) local nres = 1 - + for i=1,select("#", ...) do local v = select(i, ...) nres = SerializeValue(v, serializeTbl, nres) end - + serializeTbl[nres+1] = "^^" -- "^^" = End of serialized data - + return tconcat(serializeTbl, "", 1, nres+1) end @@ -175,9 +175,9 @@ local function DeserializeValue(iter,single,ctl,data) ctl,data = iter() end - if not ctl then + if not ctl then error("Supplied data misses AceSerializer terminator ('^^')") - end + end if ctl=="^^" then -- ignore extraneous data @@ -185,7 +185,7 @@ local function DeserializeValue(iter,single,ctl,data) end local res - + if ctl=="^S" then res = gsub(data, "~.", DeserializeStringHelper) elseif ctl=="^N" then @@ -218,7 +218,7 @@ local function DeserializeValue(iter,single,ctl,data) ctl,data = iter() if ctl=="^t" then break end -- ignore ^t's data k = DeserializeValue(iter,true,ctl,data) - if k==nil then + if k==nil then error("Invalid AceSerializer table format (no table end marker)") end ctl,data = iter() @@ -231,7 +231,7 @@ local function DeserializeValue(iter,single,ctl,data) else error("Invalid AceSerializer control code '"..ctl.."'") end - + if not single then return res,DeserializeValue(iter) else diff --git a/Libs/AceTab-3.0/AceTab-3.0.lua b/Libs/AceTab-3.0/AceTab-3.0.lua index b7c64db..aa67ef8 100644 --- a/Libs/AceTab-3.0/AceTab-3.0.lua +++ b/Libs/AceTab-3.0/AceTab-3.0.lua @@ -2,7 +2,7 @@ -- Note: This library is not yet finalized. -- @class file -- @name AceTab-3.0 --- @release $Id: AceTab-3.0.lua 1148 2016-07-18 09:13:02Z nevcairiel $ +-- @release $Id: AceTab-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ local ACETAB_MAJOR, ACETAB_MINOR = 'AceTab-3.0', 9 local AceTab, oldminor = LibStub:NewLibrary(ACETAB_MAJOR, ACETAB_MINOR) @@ -131,7 +131,7 @@ function AceTab:RegisterTabCompletion(descriptor, prematches, wordlist, usagefun elseif type(listenframes) ~= 'table' or type(listenframes[0]) == 'userdata' and type(listenframes.IsObjectType) == 'function' then -- single frame or framename listenframes = { listenframes } end - + -- Hook each registered listenframe and give it a matches table. for _, f in pairs(listenframes) do if type(f) == 'string' then @@ -148,7 +148,7 @@ function AceTab:RegisterTabCompletion(descriptor, prematches, wordlist, usagefun end end end - + -- Everything checks out; register this completion. if not registry[descriptor] then registry[descriptor] = { prematches = pmtable, wordlist = wordlist, usagefunc = usagefunc, listenframes = listenframes, postfunc = postfunc, pmoverwrite = pmoverwrite } @@ -358,7 +358,7 @@ function AceTab:OnTabPressed(this) firstPMLength = 0 hasNonFallback = false for i in pairs(pmolengths) do pmolengths[i] = nil end - + for desc in pairs(notfallbacks) do fillMatches(this, desc) end @@ -368,7 +368,7 @@ function AceTab:OnTabPressed(this) end end - if not firstMatch then + if not firstMatch then this.at3_last_precursor = "\0" return true end @@ -390,7 +390,7 @@ function AceTab:OnTabPressed(this) for desc, matches in pairs(this.at3matches) do -- Don't print usage statements for fallback completion groups if we have 'real' completion groups with matches. if hasNonFallback and fallbacks[desc] then break end - + -- Use the group's description as a heading for its usage statements. DEFAULT_CHAT_FRAME:AddMessage(desc..":") diff --git a/Libs/AceTimer-3.0/AceTimer-3.0.lua b/Libs/AceTimer-3.0/AceTimer-3.0.lua index 336864b..33b4da4 100644 --- a/Libs/AceTimer-3.0/AceTimer-3.0.lua +++ b/Libs/AceTimer-3.0/AceTimer-3.0.lua @@ -15,7 +15,7 @@ -- make into AceTimer. -- @class file -- @name AceTimer-3.0 --- @release $Id: AceTimer-3.0.lua 1170 2018-03-29 17:38:58Z funkydude $ +-- @release $Id: AceTimer-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $ local MAJOR, MINOR = "AceTimer-3.0", 17 -- Bump minor on changes local AceTimer, oldminor = LibStub:NewLibrary(MAJOR, MINOR) @@ -47,7 +47,7 @@ local function new(self, loop, func, delay, ...) activeTimers[timer] = timer -- Create new timer closure to wrap the "timer" object - timer.callback = function() + timer.callback = function() if not timer.cancelled then if type(timer.func) == "string" then -- We manually set the unpack count to prevent issues with an arg set that contains nil and ends with nil diff --git a/Libs/CHANGES.txt b/Libs/CHANGES.txt index 187bfa9..b1ad29b 100644 --- a/Libs/CHANGES.txt +++ b/Libs/CHANGES.txt @@ -1,128 +1,143 @@ ------------------------------------------------------------------------ -r1199 | nevcairiel | 2019-01-24 08:55:21 +0000 (Thu, 24 Jan 2019) | 1 line +r1213 | nevcairiel | 2019-06-26 06:00:41 +0000 (Wed, 26 Jun 2019) | 1 line Changed paths: M /trunk/changelog.txt Update changelog ------------------------------------------------------------------------ -r1198 | nevcairiel | 2019-01-21 23:46:52 +0000 (Mon, 21 Jan 2019) | 1 line -Changed paths: - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua - -AceGUI-3.0: ColorPicker: Store references to the background/checkers textures (Ticket #473) ------------------------------------------------------------------------- -r1197 | nevcairiel | 2019-01-21 23:41:10 +0000 (Mon, 21 Jan 2019) | 1 line -Changed paths: - M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua - -AceConfigDialog-3.0: Allow custom controls for almost all option types (Ticket #475) ------------------------------------------------------------------------- -r1196 | nevcairiel | 2019-01-21 23:35:45 +0000 (Mon, 21 Jan 2019) | 1 line +r1212 | nevcairiel | 2019-06-26 05:53:51 +0000 (Wed, 26 Jun 2019) | 1 line Changed paths: M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua -AceConfigDialog-3.0: Factor custom control creation into its own function (part of #475) +AceConfigDialog-3.0: Ensure a stable sort order when mixing negative and zero order values (Ticket #501) ------------------------------------------------------------------------ -r1195 | nevcairiel | 2019-01-21 23:24:17 +0000 (Mon, 21 Jan 2019) | 1 line +r1211 | funkydude | 2019-06-26 03:24:16 +0000 (Wed, 26 Jun 2019) | 1 line Changed paths: M /trunk/Ace3.toc -Update TOC +bump toc ------------------------------------------------------------------------ -r1194 | nevcairiel | 2018-08-25 07:59:05 +0000 (Sat, 25 Aug 2018) | 1 line +r1210 | nevcairiel | 2019-06-25 23:45:43 +0000 (Tue, 25 Jun 2019) | 1 line Changed paths: M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua - -AceConfigDialog-3.0: Remove unused GetSubOptions loop ------------------------------------------------------------------------- -r1193 | funkydude | 2018-08-02 12:24:37 +0000 (Thu, 02 Aug 2018) | 1 line -Changed paths: - M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua - M /trunk/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua - M /trunk/AceDB-3.0/AceDB-3.0.lua - M /trunk/AceDBOptions-3.0/AceDBOptions-3.0.lua - M /trunk/AceGUI-3.0/AceGUI-3.0.lua - M /trunk/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua - M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua -Remove some local references we don't use. +Clear existing GameTooltip anchors before re-anchoring it, to avoid issues with protected frame anchors in 8.2 ------------------------------------------------------------------------ -r1192 | funkydude | 2018-07-30 18:03:51 +0000 (Mon, 30 Jul 2018) | 1 line +r1209 | nevcairiel | 2019-06-24 21:01:01 +0000 (Mon, 24 Jun 2019) | 1 line Changed paths: - M /trunk/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua - M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua - M /trunk/AceGUI-3.0/widgets/AceGUIContainer-Window.lua - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua - M /trunk/tests/AceGUITest/test.lua + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua -AceGUI-3.0: Convert various texture paths to texture ids. +AceGUI-3.0: DropDown: Use a number-aware table sorting algorithm (Fixes #502) ------------------------------------------------------------------------ -r1191 | funkydude | 2018-07-27 13:29:50 +0000 (Fri, 27 Jul 2018) | 1 line +r1208 | nevcairiel | 2019-06-23 12:23:47 +0000 (Sun, 23 Jun 2019) | 1 line Changed paths: - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua + M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua -AceGUI-3.0/widgets/AceGUIWidget-Slider: Use the value passed to the OnValueChanged script, saves a call to frame:GetValue() +AceConfigDialog-3.0: Support the "sorting" table member in "radio" style as well ------------------------------------------------------------------------ -r1190 | nevcairiel | 2018-07-27 07:46:34 +0000 (Fri, 27 Jul 2018) | 1 line +r1207 | nevcairiel | 2019-06-23 12:08:33 +0000 (Sun, 23 Jun 2019) | 1 line Changed paths: - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Label.lua + M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua + M /trunk/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua -AceGUI-3.0: Label: Avoid zero-height labels more directly +AceConfigDialog-3.0: Add support for a "sorting" member in select types to indicate the order of the options ------------------------------------------------------------------------ -r1189 | nevcairiel | 2018-07-27 07:33:48 +0000 (Fri, 27 Jul 2018) | 1 line +r1206 | nevcairiel | 2019-06-22 09:13:51 +0000 (Sat, 22 Jun 2019) | 1 line Changed paths: - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Label.lua + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua -AceGUI-3.0: Label: Fix computing a label height on empty labels +Remove left-over table from previous change ------------------------------------------------------------------------ -r1188 | nevcairiel | 2018-07-25 20:26:35 +0000 (Wed, 25 Jul 2018) | 3 lines +r1205 | funkydude | 2019-06-20 20:54:05 +0000 (Thu, 20 Jun 2019) | 1 line Changed paths: - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Label.lua - -AceGUI-3.0: Prefer GetStringHeight over GetHeight for FontStrings, as this alleviates pressure on the anchor system and avoids glitches + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua -Recommended by TheDanW to help work-around anchoring issues. +AceGUIWidget-DropDown: revert change to sorting. ------------------------------------------------------------------------ -r1187 | nevcairiel | 2018-07-25 00:06:26 +0000 (Wed, 25 Jul 2018) | 1 line +r1204 | funkydude | 2019-06-19 23:46:00 +0000 (Wed, 19 Jun 2019) | 1 line Changed paths: - M /trunk/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua -AceGUI-3.0: ScrollFrame: Adjust content.width based on scroll bar visibility +AceGUIWidget-DropDown: Dropdowns are now actually alphabetical and you can use numbers as table keys. ------------------------------------------------------------------------ -r1186 | nevcairiel | 2018-07-21 14:19:18 +0000 (Sat, 21 Jul 2018) | 1 line +r1203 | nevcairiel | 2019-06-12 09:04:53 +0000 (Wed, 12 Jun 2019) | 3 lines Changed paths: - M /trunk/CallbackHandler-1.0/CallbackHandler-1.0.lua + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua -Update CallbackHandler to the latest version ------------------------------------------------------------------------- -r1185 | nevcairiel | 2018-07-21 14:15:16 +0000 (Sat, 21 Jul 2018) | 1 line -Changed paths: - M /trunk/AceBucket-3.0/AceBucket-3.0.lua +AceGUI-3.0: ColorPicker: Don't use Show/HideUIPanel for the ColorPickerFrame -AceBucket-3.0: Fix bucket firing with events that use "false" as arg1 +The ColorPickerFrame is not actually a UI Panel, and ShowUIPanel is locked in combat in 8.2 ------------------------------------------------------------------------ -r1184 | nevcairiel | 2018-07-21 14:13:14 +0000 (Sat, 21 Jul 2018) | 1 line +r1202 | nevcairiel | 2019-05-15 23:11:22 +0000 (Wed, 15 May 2019) | 3 lines Changed paths: + A /trunk/.editorconfig + M /trunk/Ace3.lua M /trunk/AceAddon-3.0/AceAddon-3.0.lua M /trunk/AceBucket-3.0/AceBucket-3.0.lua + M /trunk/AceComm-3.0/AceComm-3.0.lua + M /trunk/AceComm-3.0/ChatThrottleLib.lua + M /trunk/AceConfig-3.0/AceConfig-3.0.lua + M /trunk/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua + M /trunk/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua + M /trunk/AceConsole-3.0/AceConsole-3.0.lua + M /trunk/AceDBOptions-3.0/AceDBOptions-3.0.lua + M /trunk/AceEvent-3.0/AceEvent-3.0.lua M /trunk/AceGUI-3.0/AceGUI-3.0.lua + M /trunk/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua + M /trunk/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua + M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua + M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua + M /trunk/AceGUI-3.0/widgets/AceGUIContainer-Window.lua + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Button.lua + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Label.lua + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua + M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua + M /trunk/AceHook-3.0/AceHook-3.0.lua + M /trunk/AceSerializer-3.0/AceSerializer-3.0.lua + M /trunk/AceTab-3.0/AceTab-3.0.lua + M /trunk/AceTimer-3.0/AceTimer-3.0.lua + M /trunk/tests/AceAddon-3.0.lua + M /trunk/tests/AceComm-3.0-callbacks.lua + M /trunk/tests/AceComm-3.0-pre-4.1.lua + M /trunk/tests/AceComm-3.0.lua + M /trunk/tests/AceConfigCmd-3.0-ordering.lua + M /trunk/tests/AceConfigCmd-3.0.lua + M /trunk/tests/AceConfigRegisty-3.0-errors.lua + M /trunk/tests/AceConsole-3.0-GetArgs.lua + M /trunk/tests/AceDB-3.0-callbacks.lua + M /trunk/tests/AceDB-3.0-defaults.lua + M /trunk/tests/AceDB-3.0-namespaces.lua + M /trunk/tests/AceDB-3.0.lua + M /trunk/tests/AceEvent-3.0.lua + M /trunk/tests/AceGUI-3.0-recycle.lua + M /trunk/tests/AceGUITest/test.lua + M /trunk/tests/AceLocale-3.0.lua + M /trunk/tests/AceSerializer-3.0.lua + M /trunk/tests/AceTimer-3.0-ACE94.lua + M /trunk/tests/AceTimer-3.0-test1.lua + M /trunk/tests/AceTimer-3.0-test2.lua + M /trunk/tests/CallbackHandler-1.0.lua + M /trunk/tests/ChatThrottleLib-callbackerrors.lua + M /trunk/tests/ChatThrottleLib-upgrade-14-20-current.lua + M /trunk/tests/ChatThrottleLibs/ChatThrottleLib-v14.lua + M /trunk/tests/ChatThrottleLibs/ChatThrottleLib-v20.lua + M /trunk/tests/LibStub.lua + M /trunk/tests/wow_api.lua + +Cleanup whitespace and add EditorConfig configuration -Remove self-generating Dispatchers, and use xpcall, which now supports arguments +Patch contributed by Stanzilla ------------------------------------------------------------------------ -r1183 | nevcairiel | 2018-07-18 23:21:04 +0000 (Wed, 18 Jul 2018) | 1 line +r1201 | nevcairiel | 2019-05-15 23:07:16 +0000 (Wed, 15 May 2019) | 1 line Changed paths: - M /trunk/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua - M /trunk/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua + M /trunk/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua -AceGUI-3.0: Replace layout workaround with another one that hopefully works better +AceConfigRegistry-3.0: Add missing entries for allowed settings (Ticket #494) ------------------------------------------------------------------------ diff --git a/Libs/LibSharedMedia-3.0/CHANGES.txt b/Libs/LibSharedMedia-3.0/CHANGES.txt new file mode 100644 index 0000000..6408f0f --- /dev/null +++ b/Libs/LibSharedMedia-3.0/CHANGES.txt @@ -0,0 +1,8 @@ +------------------------------------------------------------------------ +r110 | funkydude | 2019-06-26 02:41:08 +0000 (Wed, 26 Jun 2019) | 1 line +Changed paths: + M /trunk/LibSharedMedia-3.0.toc + +bump toc +------------------------------------------------------------------------ + diff --git a/Libs/LibSharedMedia-3.0/CallbackHandler-1.0/CallbackHandler-1.0.lua b/Libs/LibSharedMedia-3.0/CallbackHandler-1.0/CallbackHandler-1.0.lua new file mode 100644 index 0000000..a8377fe --- /dev/null +++ b/Libs/LibSharedMedia-3.0/CallbackHandler-1.0/CallbackHandler-1.0.lua @@ -0,0 +1,212 @@ +--[[ $Id: CallbackHandler-1.0.lua 1186 2018-07-21 14:19:18Z nevcairiel $ ]] +local MAJOR, MINOR = "CallbackHandler-1.0", 7 +local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) + +if not CallbackHandler then return end -- No upgrade needed + +local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end} + +-- Lua APIs +local tconcat = table.concat +local assert, error, loadstring = assert, error, loadstring +local setmetatable, rawset, rawget = setmetatable, rawset, rawget +local next, select, pairs, type, tostring = next, select, pairs, type, tostring + +-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded +-- List them here for Mikk's FindGlobals script +-- GLOBALS: geterrorhandler + +local xpcall = xpcall + +local function errorhandler(err) + return geterrorhandler()(err) +end + +local function Dispatch(handlers, ...) + local index, method = next(handlers) + if not method then return end + repeat + xpcall(method, errorhandler, ...) + index, method = next(handlers, index) + until not method +end + +-------------------------------------------------------------------------- +-- CallbackHandler:New +-- +-- target - target object to embed public APIs in +-- RegisterName - name of the callback registration API, default "RegisterCallback" +-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback" +-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API. + +function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName) + + RegisterName = RegisterName or "RegisterCallback" + UnregisterName = UnregisterName or "UnregisterCallback" + if UnregisterAllName==nil then -- false is used to indicate "don't want this method" + UnregisterAllName = "UnregisterAllCallbacks" + end + + -- we declare all objects and exported APIs inside this closure to quickly gain access + -- to e.g. function names, the "target" parameter, etc + + + -- Create the registry object + local events = setmetatable({}, meta) + local registry = { recurse=0, events=events } + + -- registry:Fire() - fires the given event/message into the registry + function registry:Fire(eventname, ...) + if not rawget(events, eventname) or not next(events[eventname]) then return end + local oldrecurse = registry.recurse + registry.recurse = oldrecurse + 1 + + Dispatch(events[eventname], eventname, ...) + + registry.recurse = oldrecurse + + if registry.insertQueue and oldrecurse==0 then + -- Something in one of our callbacks wanted to register more callbacks; they got queued + for eventname,callbacks in pairs(registry.insertQueue) do + local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten. + for self,func in pairs(callbacks) do + events[eventname][self] = func + -- fire OnUsed callback? + if first and registry.OnUsed then + registry.OnUsed(registry, target, eventname) + first = nil + end + end + end + registry.insertQueue = nil + end + end + + -- Registration of a callback, handles: + -- self["method"], leads to self["method"](self, ...) + -- self with function ref, leads to functionref(...) + -- "addonId" (instead of self) with function ref, leads to functionref(...) + -- all with an optional arg, which, if present, gets passed as first argument (after self if present) + target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]]) + if type(eventname) ~= "string" then + error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2) + end + + method = method or eventname + + local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten. + + if type(method) ~= "string" and type(method) ~= "function" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2) + end + + local regfunc + + if type(method) == "string" then + -- self["method"] calling style + if type(self) ~= "table" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2) + elseif self==target then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2) + elseif type(self[method]) ~= "function" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2) + end + + if select("#",...)>=1 then -- this is not the same as testing for arg==nil! + local arg=select(1,...) + regfunc = function(...) self[method](self,arg,...) end + else + regfunc = function(...) self[method](self,...) end + end + else + -- function ref with self=object or self="addonId" or self=thread + if type(self)~="table" and type(self)~="string" and type(self)~="thread" then + error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2) + end + + if select("#",...)>=1 then -- this is not the same as testing for arg==nil! + local arg=select(1,...) + regfunc = function(...) method(arg,...) end + else + regfunc = method + end + end + + + if events[eventname][self] or registry.recurse<1 then + -- if registry.recurse<1 then + -- we're overwriting an existing entry, or not currently recursing. just set it. + events[eventname][self] = regfunc + -- fire OnUsed callback? + if registry.OnUsed and first then + registry.OnUsed(registry, target, eventname) + end + else + -- we're currently processing a callback in this registry, so delay the registration of this new entry! + -- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency + registry.insertQueue = registry.insertQueue or setmetatable({},meta) + registry.insertQueue[eventname][self] = regfunc + end + end + + -- Unregister a callback + target[UnregisterName] = function(self, eventname) + if not self or self==target then + error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2) + end + if type(eventname) ~= "string" then + error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2) + end + if rawget(events, eventname) and events[eventname][self] then + events[eventname][self] = nil + -- Fire OnUnused callback? + if registry.OnUnused and not next(events[eventname]) then + registry.OnUnused(registry, target, eventname) + end + end + if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then + registry.insertQueue[eventname][self] = nil + end + end + + -- OPTIONAL: Unregister all callbacks for given selfs/addonIds + if UnregisterAllName then + target[UnregisterAllName] = function(...) + if select("#",...)<1 then + error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2) + end + if select("#",...)==1 and ...==target then + error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2) + end + + + for i=1,select("#",...) do + local self = select(i,...) + if registry.insertQueue then + for eventname, callbacks in pairs(registry.insertQueue) do + if callbacks[self] then + callbacks[self] = nil + end + end + end + for eventname, callbacks in pairs(events) do + if callbacks[self] then + callbacks[self] = nil + -- Fire OnUnused callback? + if registry.OnUnused and not next(callbacks) then + registry.OnUnused(registry, target, eventname) + end + end + end + end + end + end + + return registry +end + + +-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it +-- try to upgrade old implicit embeds since the system is selfcontained and +-- relies on closures to work. + diff --git a/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua deleted file mode 100644 index ce5ff14..0000000 --- a/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua +++ /dev/null @@ -1,292 +0,0 @@ ---[[ -Name: LibSharedMedia-3.0 -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/ -Description: Shared handling of media data (fonts, sounds, textures, ...) between addons. -Dependencies: LibStub, CallbackHandler-1.0 -License: LGPL v2.1 -]] - -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 - -local _G = getfenv(0) - -local pairs = _G.pairs -local type = _G.type - -local band = _G.bit.band - -local table_insert = _G.table.insert -local table_sort = _G.table.sort - -local locale = GetLocale() -local locale_is_western -local LOCALE_MASK = 0 -lib.LOCALE_BIT_koKR = 1 -lib.LOCALE_BIT_ruRU = 2 -lib.LOCALE_BIT_zhCN = 4 -lib.LOCALE_BIT_zhTW = 8 -lib.LOCALE_BIT_western = 128 - -local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0") - -lib.callbacks = lib.callbacks or CallbackHandler:New(lib) - -lib.DefaultMedia = lib.DefaultMedia or {} -lib.MediaList = lib.MediaList or {} -lib.MediaTable = lib.MediaTable or {} -lib.MediaType = lib.MediaType or {} -lib.OverrideMedia = lib.OverrideMedia or {} - -local defaultMedia = lib.DefaultMedia -local mediaList = lib.MediaList -local mediaTable = lib.MediaTable -local overrideMedia = lib.OverrideMedia - - --- create mediatype constants -lib.MediaType.BACKGROUND = "background" -- background textures -lib.MediaType.BORDER = "border" -- border textures -lib.MediaType.FONT = "font" -- fonts -lib.MediaType.STATUSBAR = "statusbar" -- statusbar textures -lib.MediaType.SOUND = "sound" -- sound files - --- populate lib with default Blizzard data --- 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]] -lib.MediaTable.background["Blizzard Parchment"] = [[Interface\AchievementFrame\UI-Achievement-Parchment-Horizontal]] -lib.MediaTable.background["Blizzard Parchment 2"] = [[Interface\AchievementFrame\UI-GuildAchievement-Parchment-Horizontal]] -lib.MediaTable.background["Blizzard Rock"] = [[Interface\FrameGeneral\UI-Background-Rock]] -lib.MediaTable.background["Blizzard Tabard Background"] = [[Interface\TabardFrame\TabardFrameBackground]] -lib.MediaTable.background["Blizzard Tooltip"] = [[Interface\Tooltips\UI-Tooltip-Background]] -lib.MediaTable.background["Solid"] = [[Interface\Buttons\WHITE8X8]] -lib.DefaultMedia.background = "None" - --- BORDER -if not lib.MediaTable.border then lib.MediaTable.border = {} end -lib.MediaTable.border["None"] = [[]] -lib.MediaTable.border["Blizzard Achievement Wood"] = [[Interface\AchievementFrame\UI-Achievement-WoodBorder]] -lib.MediaTable.border["Blizzard Chat Bubble"] = [[Interface\Tooltips\ChatBubble-Backdrop]] -lib.MediaTable.border["Blizzard Dialog"] = [[Interface\DialogFrame\UI-DialogBox-Border]] -lib.MediaTable.border["Blizzard Dialog Gold"] = [[Interface\DialogFrame\UI-DialogBox-Gold-Border]] -lib.MediaTable.border["Blizzard Party"] = [[Interface\CHARACTERFRAME\UI-Party-Border]] -lib.MediaTable.border["Blizzard Tooltip"] = [[Interface\Tooltips\UI-Tooltip-Border]] -lib.DefaultMedia.border = "None" - --- 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 --- - SML_MT_font["굵은 글꼴"] = [[Fonts\2002B.TTF]] - SML_MT_font["기본 글꼴"] = [[Fonts\2002.TTF]] - SML_MT_font["데미지 글꼴"] = [[Fonts\K_Damage.TTF]] - SML_MT_font["퀘스트 글꼴"] = [[Fonts\K_Pagetext.TTF]] --- - lib.DefaultMedia["font"] = "기본 글꼴" -- someone from koKR please adjust if needed --- -elseif locale == "zhCN" then - LOCALE_MASK = lib.LOCALE_BIT_zhCN --- - SML_MT_font["伤害数字"] = [[Fonts\ARKai_C.ttf]] - SML_MT_font["默认"] = [[Fonts\ARKai_T.ttf]] - SML_MT_font["聊天"] = [[Fonts\ARHei.ttf]] --- - lib.DefaultMedia["font"] = "默认" -- someone from zhCN please adjust if needed --- -elseif locale == "zhTW" then - LOCALE_MASK = lib.LOCALE_BIT_zhTW --- - SML_MT_font["提示訊息"] = [[Fonts\bHEI00M.ttf]] - SML_MT_font["聊天"] = [[Fonts\bHEI01B.ttf]] - SML_MT_font["傷害數字"] = [[Fonts\bKAI00M.ttf]] - SML_MT_font["預設"] = [[Fonts\bLEI00D.ttf]] --- - lib.DefaultMedia["font"] = "預設" -- someone from zhTW please adjust if needed - -elseif locale == "ruRU" then - LOCALE_MASK = lib.LOCALE_BIT_ruRU --- - 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" --- -else - LOCALE_MASK = lib.LOCALE_BIT_western - locale_is_western = true --- - 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" --- -end - --- STATUSBAR -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 -if not lib.MediaTable.sound then lib.MediaTable.sound = {} end -lib.MediaTable.sound["None"] = [[Interface\Quiet.ogg]] -- Relies on the fact that PlaySound[File] doesn't error on non-existing input. -lib.DefaultMedia.sound = "None" - -local function rebuildMediaList(mediatype) - local mtable = mediaTable[mediatype] - if not mtable then return end - if not mediaList[mediatype] then mediaList[mediatype] = {} end - local mlist = mediaList[mediatype] - -- list can only get larger, so simply overwrite it - local i = 0 - for k in pairs(mtable) do - i = i + 1 - mlist[i] = k - end - table_sort(mlist) -end - -function lib:Register(mediatype, key, data, langmask) - if type(mediatype) ~= "string" then - error(MAJOR..":Register(mediatype, key, data, langmask) - mediatype must be string, got "..type(mediatype)) - end - if type(key) ~= "string" then - 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.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 - - mtable[key] = data - rebuildMediaList(mediatype) - self.callbacks:Fire("LibSharedMedia_Registered", mediatype, key) - return true -end - -function lib:Fetch(mediatype, key, noDefault) - local mtt = mediaTable[mediatype] - local overridekey = overrideMedia[mediatype] - local result = mtt and ((overridekey and mtt[overridekey] or mtt[key]) or (not noDefault and defaultMedia[mediatype] and mtt[defaultMedia[mediatype]])) or nil - return result ~= "" and result or nil -end - -function lib:IsValid(mediatype, key) - return mediaTable[mediatype] and (not key or mediaTable[mediatype][key]) and true or false -end - -function lib:HashTable(mediatype) - return mediaTable[mediatype] -end - -function lib:List(mediatype) - if not mediaTable[mediatype] then - return nil - end - if not mediaList[mediatype] then - rebuildMediaList(mediatype) - end - return mediaList[mediatype] -end - -function lib:GetGlobal(mediatype) - return overrideMedia[mediatype] -end - -function lib:SetGlobal(mediatype, key) - if not mediaTable[mediatype] then - return false - end - overrideMedia[mediatype] = (key and mediaTable[mediatype][key]) and key or nil - self.callbacks:Fire("LibSharedMedia_SetGlobal", mediatype, overrideMedia[mediatype]) - return true -end - -function lib:GetDefault(mediatype) - return defaultMedia[mediatype] -end - -function lib:SetDefault(mediatype, key) - if mediaTable[mediatype] and mediaTable[mediatype][key] and not defaultMedia[mediatype] then - defaultMedia[mediatype] = key - return true - else - return false - end -end diff --git a/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.toc b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.toc new file mode 100644 index 0000000..f1e310e --- /dev/null +++ b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.toc @@ -0,0 +1,18 @@ +## Interface: 80200 +## LoadOnDemand: 1 + +## Title: Lib: SharedMedia-3.0 +## Notes: Shared handling of media data (fonts, sounds, textures, ...) between addons. +## Author: Elkano +## Version: 3.0-110 +## X-Website: http://www.wowace.com/projects/libsharedmedia-3-0/ +## X-Category: Library + +## X-Revision: 110 +## X-Date: 2019-06-26T2:41:08Z + +LibStub\LibStub.lua +CallbackHandler-1.0\CallbackHandler-1.0.lua + +LibSharedMedia-3.0\lib.xml + diff --git a/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0/LibSharedMedia-3.0.lua b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0/LibSharedMedia-3.0.lua new file mode 100644 index 0000000..ae7c6eb --- /dev/null +++ b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0/LibSharedMedia-3.0.lua @@ -0,0 +1,290 @@ +--[[ +Name: LibSharedMedia-3.0 +Revision: $Revision: 107 $ +Author: Elkano (elkano@gmx.de) +Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com) +Website: http://www.wowace.com/projects/libsharedmedia-3-0/ +Description: Shared handling of media data (fonts, sounds, textures, ...) between addons. +Dependencies: LibStub, CallbackHandler-1.0 +License: LGPL v2.1 +]] + +local MAJOR, MINOR = "LibSharedMedia-3.0", 6010003 -- Increase manually on changes +local lib = LibStub:NewLibrary(MAJOR, MINOR) + +if not lib then return end + +local _G = getfenv(0) + +local pairs = _G.pairs +local type = _G.type + +local band = _G.bit.band +local table_sort = _G.table.sort + +local locale = GetLocale() +local locale_is_western +local LOCALE_MASK = 0 +lib.LOCALE_BIT_koKR = 1 +lib.LOCALE_BIT_ruRU = 2 +lib.LOCALE_BIT_zhCN = 4 +lib.LOCALE_BIT_zhTW = 8 +lib.LOCALE_BIT_western = 128 + +local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0") + +lib.callbacks = lib.callbacks or CallbackHandler:New(lib) + +lib.DefaultMedia = lib.DefaultMedia or {} +lib.MediaList = lib.MediaList or {} +lib.MediaTable = lib.MediaTable or {} +lib.MediaType = lib.MediaType or {} +lib.OverrideMedia = lib.OverrideMedia or {} + +local defaultMedia = lib.DefaultMedia +local mediaList = lib.MediaList +local mediaTable = lib.MediaTable +local overrideMedia = lib.OverrideMedia + + +-- create mediatype constants +lib.MediaType.BACKGROUND = "background" -- background textures +lib.MediaType.BORDER = "border" -- border textures +lib.MediaType.FONT = "font" -- fonts +lib.MediaType.STATUSBAR = "statusbar" -- statusbar textures +lib.MediaType.SOUND = "sound" -- sound files + +-- populate lib with default Blizzard data +-- 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]] +lib.MediaTable.background["Blizzard Parchment"] = [[Interface\AchievementFrame\UI-Achievement-Parchment-Horizontal]] +lib.MediaTable.background["Blizzard Parchment 2"] = [[Interface\AchievementFrame\UI-GuildAchievement-Parchment-Horizontal]] +lib.MediaTable.background["Blizzard Rock"] = [[Interface\FrameGeneral\UI-Background-Rock]] +lib.MediaTable.background["Blizzard Tabard Background"] = [[Interface\TabardFrame\TabardFrameBackground]] +lib.MediaTable.background["Blizzard Tooltip"] = [[Interface\Tooltips\UI-Tooltip-Background]] +lib.MediaTable.background["Solid"] = [[Interface\Buttons\WHITE8X8]] +lib.DefaultMedia.background = "None" + +-- BORDER +if not lib.MediaTable.border then lib.MediaTable.border = {} end +lib.MediaTable.border["None"] = [[]] +lib.MediaTable.border["Blizzard Achievement Wood"] = [[Interface\AchievementFrame\UI-Achievement-WoodBorder]] +lib.MediaTable.border["Blizzard Chat Bubble"] = [[Interface\Tooltips\ChatBubble-Backdrop]] +lib.MediaTable.border["Blizzard Dialog"] = [[Interface\DialogFrame\UI-DialogBox-Border]] +lib.MediaTable.border["Blizzard Dialog Gold"] = [[Interface\DialogFrame\UI-DialogBox-Gold-Border]] +lib.MediaTable.border["Blizzard Party"] = [[Interface\CHARACTERFRAME\UI-Party-Border]] +lib.MediaTable.border["Blizzard Tooltip"] = [[Interface\Tooltips\UI-Tooltip-Border]] +lib.DefaultMedia.border = "None" + +-- 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 +-- + SML_MT_font["굵은 글꼴"] = [[Fonts\2002B.TTF]] + SML_MT_font["기본 글꼴"] = [[Fonts\2002.TTF]] + SML_MT_font["데미지 글꼴"] = [[Fonts\K_Damage.TTF]] + SML_MT_font["퀘스트 글꼴"] = [[Fonts\K_Pagetext.TTF]] +-- + lib.DefaultMedia["font"] = "기본 글꼴" -- someone from koKR please adjust if needed +-- +elseif locale == "zhCN" then + LOCALE_MASK = lib.LOCALE_BIT_zhCN +-- + SML_MT_font["伤害数字"] = [[Fonts\ARKai_C.ttf]] + SML_MT_font["默认"] = [[Fonts\ARKai_T.ttf]] + SML_MT_font["聊天"] = [[Fonts\ARHei.ttf]] +-- + lib.DefaultMedia["font"] = "默认" -- someone from zhCN please adjust if needed +-- +elseif locale == "zhTW" then + LOCALE_MASK = lib.LOCALE_BIT_zhTW +-- + SML_MT_font["提示訊息"] = [[Fonts\bHEI00M.ttf]] + SML_MT_font["聊天"] = [[Fonts\bHEI01B.ttf]] + SML_MT_font["傷害數字"] = [[Fonts\bKAI00M.ttf]] + SML_MT_font["預設"] = [[Fonts\bLEI00D.ttf]] +-- + lib.DefaultMedia["font"] = "預設" -- someone from zhTW please adjust if needed + +elseif locale == "ruRU" then + LOCALE_MASK = lib.LOCALE_BIT_ruRU +-- + 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" +-- +else + LOCALE_MASK = lib.LOCALE_BIT_western + locale_is_western = true +-- + 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" +-- +end + +-- STATUSBAR +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 +if not lib.MediaTable.sound then lib.MediaTable.sound = {} end +lib.MediaTable.sound["None"] = C_RaidLocks and 1 or [[Interface\Quiet.ogg]] -- Relies on the fact that PlaySound[File] doesn't error on non-existing input. +lib.DefaultMedia.sound = "None" + +local function rebuildMediaList(mediatype) + local mtable = mediaTable[mediatype] + if not mtable then return end + if not mediaList[mediatype] then mediaList[mediatype] = {} end + local mlist = mediaList[mediatype] + -- list can only get larger, so simply overwrite it + local i = 0 + for k in pairs(mtable) do + i = i + 1 + mlist[i] = k + end + table_sort(mlist) +end + +function lib:Register(mediatype, key, data, langmask) + if type(mediatype) ~= "string" then + error(MAJOR..":Register(mediatype, key, data, langmask) - mediatype must be string, got "..type(mediatype)) + end + if type(key) ~= "string" then + 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.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 + + mtable[key] = data + rebuildMediaList(mediatype) + self.callbacks:Fire("LibSharedMedia_Registered", mediatype, key) + return true +end + +function lib:Fetch(mediatype, key, noDefault) + local mtt = mediaTable[mediatype] + local overridekey = overrideMedia[mediatype] + local result = mtt and ((overridekey and mtt[overridekey] or mtt[key]) or (not noDefault and defaultMedia[mediatype] and mtt[defaultMedia[mediatype]])) or nil + return result ~= "" and result or nil +end + +function lib:IsValid(mediatype, key) + return mediaTable[mediatype] and (not key or mediaTable[mediatype][key]) and true or false +end + +function lib:HashTable(mediatype) + return mediaTable[mediatype] +end + +function lib:List(mediatype) + if not mediaTable[mediatype] then + return nil + end + if not mediaList[mediatype] then + rebuildMediaList(mediatype) + end + return mediaList[mediatype] +end + +function lib:GetGlobal(mediatype) + return overrideMedia[mediatype] +end + +function lib:SetGlobal(mediatype, key) + if not mediaTable[mediatype] then + return false + end + overrideMedia[mediatype] = (key and mediaTable[mediatype][key]) and key or nil + self.callbacks:Fire("LibSharedMedia_SetGlobal", mediatype, overrideMedia[mediatype]) + return true +end + +function lib:GetDefault(mediatype) + return defaultMedia[mediatype] +end + +function lib:SetDefault(mediatype, key) + if mediaTable[mediatype] and mediaTable[mediatype][key] and not defaultMedia[mediatype] then + defaultMedia[mediatype] = key + return true + else + return false + end +end diff --git a/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0/lib.xml b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0/lib.xml new file mode 100644 index 0000000..7f2fd53 --- /dev/null +++ b/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0/lib.xml @@ -0,0 +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> diff --git a/Libs/LibSharedMedia-3.0/LibStub/LibStub.lua b/Libs/LibSharedMedia-3.0/LibStub/LibStub.lua new file mode 100644 index 0000000..ae1900e --- /dev/null +++ b/Libs/LibSharedMedia-3.0/LibStub/LibStub.lua @@ -0,0 +1,51 @@ +-- $Id: LibStub.lua 76 2007-09-03 01:50:17Z mikk $ +-- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info +-- LibStub is hereby placed in the Public Domain +-- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke +local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS! +local LibStub = _G[LIBSTUB_MAJOR] + +-- Check to see is this version of the stub is obsolete +if not LibStub or LibStub.minor < LIBSTUB_MINOR then + LibStub = LibStub or {libs = {}, minors = {} } + _G[LIBSTUB_MAJOR] = LibStub + LibStub.minor = LIBSTUB_MINOR + + -- LibStub:NewLibrary(major, minor) + -- major (string) - the major version of the library + -- minor (string or number ) - the minor version of the library + -- + -- returns nil if a newer or same version of the lib is already present + -- returns empty library object or old library object if upgrade is needed + function LibStub:NewLibrary(major, minor) + assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") + minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.") + + local oldminor = self.minors[major] + if oldminor and oldminor >= minor then return nil end + self.minors[major], self.libs[major] = minor, self.libs[major] or {} + return self.libs[major], oldminor + end + + -- LibStub:GetLibrary(major, [silent]) + -- major (string) - the major version of the library + -- silent (boolean) - if true, library is optional, silently return nil if its not found + -- + -- throws an error if the library can not be found (except silent is set) + -- returns the library object if found + function LibStub:GetLibrary(major, silent) + if not self.libs[major] and not silent then + error(("Cannot find a library instance of %q."):format(tostring(major)), 2) + end + return self.libs[major], self.minors[major] + end + + -- LibStub:IterateLibraries() + -- + -- Returns an iterator for the currently registered libraries + function LibStub:IterateLibraries() + return pairs(self.libs) + end + + setmetatable(LibStub, { __call = LibStub.GetLibrary }) +end diff --git a/Libs/LibSharedMedia-3.0/lib.xml b/Libs/LibSharedMedia-3.0/lib.xml index 34aa874..c81f35f 100644 --- a/Libs/LibSharedMedia-3.0/lib.xml +++ b/Libs/LibSharedMedia-3.0/lib.xml @@ -1,4 +1,5 @@ <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 + <Include file="LibSharedMedia-3.0\lib.xml"/> +</Ui> + diff --git a/Libs/changelog.txt b/Libs/changelog.txt index 69139b6..6c00e8c 100644 --- a/Libs/changelog.txt +++ b/Libs/changelog.txt @@ -1,3 +1,12 @@ +Ace3 Release - Revision r1214 (June 26th, 2019) +----------------------------------------------- +- AceConfigDialog-3.0: Exposed "select" type sorting control through a new "sorting" config table member +- AceConfigDialog-3.0: Clear existing anchors on the GameTooltip before re-anchoring it for 8.2 compatibility +- AceConfigDialog-3.0: Improved options table sorting algorithm to produce a stable result in certain edge cases (Ticket #501) +- AceConfigRegistry-3.0: Added missing custom controls entries for all types added in the last release (Ticket #494) +- AceGUI-3.0: ColorPicker: Removed usage of Show/HideUIPanel for WoW 8.2 compatibiliy +- AceGUI-3.0: DropDown: Improved dropdown sorting algorithm to support tables with mixed string and numeric keys + Ace3 Release - Revision r1200 (January 24th, 2019) -------------------------------------------------- - Cleanup for WoW 8.0 improvements