Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Softrix committed Dec 19, 2022
0 parents commit 59229f5
Show file tree
Hide file tree
Showing 42 changed files with 11,542 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto
11 changes: 11 additions & 0 deletions Bindings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<Bindings>
<Binding name="SMARTBUFF_BIND_TRIGGER" header="SMARTBUFF">
SMARTBUFF_Check(0);
</Binding>
<Binding name="SMARTBUFF_BIND_OPTIONS">
SMARTBUFF_OptionsFrame_Toggle();
</Binding>
<Binding name="SMARTBUFF_BIND_RESETBUFFTIMERS">
SMARTBUFF_ResetBuffTimers(0);
</Binding>
</Bindings>
Binary file added Icons/Deathknight.tga
Binary file not shown.
Binary file added Icons/DeathknightPet.tga
Binary file not shown.
Binary file added Icons/Demonhunter.tga
Binary file not shown.
Binary file added Icons/Druid.tga
Binary file not shown.
Binary file added Icons/Envoker.tga
Binary file not shown.
Binary file added Icons/Hunter.tga
Binary file not shown.
Binary file added Icons/HunterPet.tga
Binary file not shown.
Binary file added Icons/IconDisabled.tga
Binary file not shown.
Binary file added Icons/IconEnabled.tga
Binary file not shown.
Binary file added Icons/Mage.tga
Binary file not shown.
Binary file added Icons/MiniMapButtonDisabled.tga
Binary file not shown.
Binary file added Icons/MiniMapButtonEnabled.tga
Binary file not shown.
Binary file added Icons/Monk.tga
Binary file not shown.
Binary file added Icons/Paladin.tga
Binary file not shown.
Binary file added Icons/Priest.tga
Binary file not shown.
Binary file added Icons/Rogue.tga
Binary file not shown.
Binary file added Icons/Shaman.tga
Binary file not shown.
Binary file added Icons/Warlock.tga
Binary file not shown.
Binary file added Icons/WarlockPet.tga
Binary file not shown.
Binary file added Icons/Warrior.tga
Binary file not shown.
Binary file added Icons/empty.tga
Binary file not shown.
45 changes: 45 additions & 0 deletions Libs/Broker_SmartBuff/Broker_SmartBuff.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
-------------------------------------------------------------------------------
-- Broker: SmartBuff
-- Created by Aeldra (EU-Proudmoore)
--
-- Data Broker support
-------------------------------------------------------------------------------

if (not SMARTBUFF_TITLE) then return end

local F = CreateFrame("Frame", "Broker_SmartBuff");

function SMARTBUFF_BROKER_SetIcon()
if (not F.LS) then return end
if (SMARTBUFF_Options and SMARTBUFF_Options.Toggle) then
F.LS.icon = "Interface\\AddOns\\SmartBuff\\Icons\\IconEnabled";
else
F.LS.icon = "Interface\\AddOns\\SmartBuff\\Icons\\IconDisabled";
end
end

F.LS = LibStub:GetLibrary("LibDataBroker-1.1"):NewDataObject("SmartBuff", {
type = "launcher",
label = SMARTBUFF_TITLE,
OnClick = function(_, msg)
if (msg == "RightButton") then
SMARTBUFF_OToggle();
SMARTBUFF_BROKER_SetIcon(); -- bug fix, credit: SunNova
elseif (msg == "LeftButton" and IsAltKeyDown()) then
if (IsAddOnLoaded("SmartDebuff")) then
SMARTDEBUFF_ToggleSF();
end
elseif (msg == "LeftButton") then
SMARTBUFF_OptionsFrame_Toggle();
end
end,
icon = "Interface\\AddOns\\SmartBuff\\Icons\\IconDisabled",
OnTooltipShow = function(tooltip)
if (not tooltip or not tooltip.AddLine) then return end
tooltip:AddLine("|cffffffff"..SMARTBUFF_TITLE.."|r");
tooltip:AddLine(SMARTBUFF_TITAN_TT);
end,
});

F:Hide();
--print("Borker - SmartBuff loaded");
10 changes: 10 additions & 0 deletions Libs/Broker_SmartBuff/Broker_SmartBuff.toc
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
## Interface: 90207
## Title: Broker: Smart|cffffffffBuff|r
## Version: 1.90207
## Notes: SmartBuff support for Data Broker
## Author: |cff20d2ffAeldra|r (EU-Proudmoore)
## Dependencies: SmartBuff
## X-Category: Miscellaneous

LibDataBroker-1.1.lua
Broker_SmartBuff.lua
90 changes: 90 additions & 0 deletions Libs/Broker_SmartBuff/LibDataBroker-1.1.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@

assert(LibStub, "LibDataBroker-1.1 requires LibStub")
assert(LibStub:GetLibrary("CallbackHandler-1.0", true), "LibDataBroker-1.1 requires CallbackHandler-1.0")

local lib, oldminor = LibStub:NewLibrary("LibDataBroker-1.1", 4)
if not lib then return end
oldminor = oldminor or 0


lib.callbacks = lib.callbacks or LibStub:GetLibrary("CallbackHandler-1.0"):New(lib)
lib.attributestorage, lib.namestorage, lib.proxystorage = lib.attributestorage or {}, lib.namestorage or {}, lib.proxystorage or {}
local attributestorage, namestorage, callbacks = lib.attributestorage, lib.namestorage, lib.callbacks

if oldminor < 2 then
lib.domt = {
__metatable = "access denied",
__index = function(self, key) return attributestorage[self] and attributestorage[self][key] end,
}
end

if oldminor < 3 then
lib.domt.__newindex = function(self, key, value)
if not attributestorage[self] then attributestorage[self] = {} end
if attributestorage[self][key] == value then return end
attributestorage[self][key] = value
local name = namestorage[self]
if not name then return end
callbacks:Fire("LibDataBroker_AttributeChanged", name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged_"..name, name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged_"..name.."_"..key, name, key, value, self)
callbacks:Fire("LibDataBroker_AttributeChanged__"..key, name, key, value, self)
end
end

if oldminor < 2 then
function lib:NewDataObject(name, dataobj)
if self.proxystorage[name] then return end

if dataobj then
assert(type(dataobj) == "table", "Invalid dataobj, must be nil or a table")
self.attributestorage[dataobj] = {}
for i,v in pairs(dataobj) do
self.attributestorage[dataobj][i] = v
dataobj[i] = nil
end
end
dataobj = setmetatable(dataobj or {}, self.domt)
self.proxystorage[name], self.namestorage[dataobj] = dataobj, name
self.callbacks:Fire("LibDataBroker_DataObjectCreated", name, dataobj)
return dataobj
end
end

if oldminor < 1 then
function lib:DataObjectIterator()
return pairs(self.proxystorage)
end

function lib:GetDataObjectByName(dataobjectname)
return self.proxystorage[dataobjectname]
end

function lib:GetNameByDataObject(dataobject)
return self.namestorage[dataobject]
end
end

if oldminor < 4 then
local next = pairs(attributestorage)
function lib:pairs(dataobject_or_name)
local t = type(dataobject_or_name)
assert(t == "string" or t == "table", "Usage: ldb:pairs('dataobjectname') or ldb:pairs(dataobject)")

local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name
assert(attributestorage[dataobj], "Data object not found")

return next, attributestorage[dataobj], nil
end

local ipairs_iter = ipairs(attributestorage)
function lib:ipairs(dataobject_or_name)
local t = type(dataobject_or_name)
assert(t == "string" or t == "table", "Usage: ldb:ipairs('dataobjectname') or ldb:ipairs(dataobject)")

local dataobj = self.proxystorage[dataobject_or_name] or dataobject_or_name
assert(attributestorage[dataobj], "Data object not found")

return ipairs_iter, attributestorage[dataobj], 0
end
end
212 changes: 212 additions & 0 deletions Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
Original file line number Diff line number Diff line change
@@ -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.

Loading

0 comments on commit 59229f5

Please sign in to comment.