Extending library

Wobin [05-29-14 - 15:25]
Extending library
Filename
LibSort-1.0.lua
diff --git a/LibSort-1.0.lua b/LibSort-1.0.lua
index f353428..e75f536 100644
--- a/LibSort-1.0.lua
+++ b/LibSort-1.0.lua
@@ -1,3 +1,65 @@
 local MAJOR, MINOR = "LibSort-1.0", 1
-local LibGuildInfo, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
-if not LibGuildInfo then return end	--the same or newer version of this lib is already loaded into memory
+local LibSort, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+if not LibSort then return end	--the same or newer version of this lib is already loaded into memory
+
+local defaultType = {["number"] = 0, ["boolean"] = false, ["string"] = ""}
+
+LibSort.RegisteredCallbacks = {}
+
+function LibStub:Loaded(event, name)
+    if name ~= "ZO_Ingame" then return end
+
+    self.savedVars = ZO_SavedVars:New("ZO_Ingame_SavedVariables", 1, "LibSort")
+    self.control:UnregisterForEvent(EVENT_ADD_ON_LOADED)
+
+    -- Hook for BindSlot allows us to inject sort datapoints
+	self.hookedBindSlot = ZO_Inventory_BindSlot
+	ZO_Inventory_BindSlot =
+		function(...)
+			-- First setup the default ZO datapoints
+			self.hookedBindSlot(...)
+			local control, slotType, index, bag = ...
+			local slot = control:GetParent()
+
+			-- If, for whatever reason, we're not actually dealing with sortable stuff...
+			if not slot or not slot.dataEntry or not slot.dataEntry.data then return end
+
+			-- Now inject our requirements
+			for addon, callbacks in pairs(LibSort.RegisteredCallbacks) do
+				for name, data in pairs(callbacks) do
+					slot.dataEntry.data[data.key] = data.func(slotType, bag, index) or defaultType[data.dataType]
+				end
+			end
+		end
+end
+
+EVENT_MANAGER:RegisterForEvent("LibSortLoaded", EVENT_ADD_ON_LOADED, function(...) LibSort:Loaded(...) end)
+
+--------- API ---------
+
+function LibSort:Unregister(addonName, name)
+	self.RegisteredCallbacks[name] = nil
+end
+
+function LibSort:Register(addonName, name, desc, key, func)
+	self:RegisterNumeric(addonName, name, key, func)
+end
+
+function LibSort:RegisterNumeric(addonName, name, desc, key, func)
+	if not self.RegisteredCallbacks[addonName] then self.RegisteredCallbacks[addonName] = {} end
+	self.RegisteredCallbacks[addonName][name] = {key = key, func = func, desc = desc, dataType = "number"}
+end
+
+function LibSort:RegisterBoolean(addonName, name, desc, key, func)
+	if not self.RegisteredCallbacks[addonName] then self.RegisteredCallbacks[addonName] = {} end
+	self.RegisteredCallbacks[addonName][name] = {key = key, func = func, desc = desc, dataType = "boolean"}
+end
+
+function LibSort:RegisterString(addonName, name, desc, key, func)
+	if not self.RegisteredCallbacks[addonName] then self.RegisteredCallbacks[addonName] = {} end
+	self.RegisteredCallbacks[addonName][name] = {key = key, func = func, desc = desc, dataType = "string"}
+end
+
+function LibSort:RegisterDefaultOrder(addonName, keyTable)
+	self.DefaultOrders[addonName] = keyTable
+end