Eggerd

World of Warcraft, Addon "Fontain" Fix, Legion 7.0.3

Sep 19th, 2016 (edited)
474
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.26 KB | None | 0 0
  1. -- File: Fontain.lua
  2. -- Mostly derived from Tekkub's tekticles, with permission
  3.  
  4. Fontain = LibStub("AceAddon-3.0"):NewAddon("Fontain", "AceEvent-3.0", "AceConsole-3.0")
  5.  
  6. local _G = getfenv(0)
  7. local media = LibStub("LibSharedMedia-3.0")
  8. local mod = Fontain
  9. local db
  10. local fontList = {}
  11. local fontDefaults = {}
  12. local type, pairs, ipairs, getmetatable = _G.type, _G.pairs, _G.ipairs, _G.getmetatable
  13. local tinsert, unpack = _G.tinsert, _G.unpack
  14.  
  15. local defaults = {
  16.     profile = {
  17.         font = media:Fetch("font", media.DefaultMedia.font),
  18.         fonts = {},
  19.         sizes = {},
  20.         flags = {},
  21.         enabled = true
  22.     }
  23. }
  24.  
  25. mod.fontList = fontList
  26. mod.fontDefaults = fontDefaults
  27.  
  28. function mod:OnInitialize()
  29.     self.db = LibStub("AceDB-3.0"):New("FontainDB", defaults)
  30.     db = self.db.profile
  31.     self.options.args.profile = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)
  32.     self.options.args.profile.order = 101
  33.     self:ApplyFonts()
  34.    
  35.     UIDROPDOWNMENU_DEFAULT_TEXT_HEIGHT = 12
  36.     CHAT_FONT_HEIGHTS = {7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}
  37. end
  38.  
  39. function mod:ADDON_LOADED()
  40.     if not db then return end  
  41.     UNIT_NAME_FONT     = media:Fetch("font", db.fonts["UnitNames"]) or UNIT_NAME_FONT
  42.     NAMEPLATE_FONT     = media:Fetch("font", db.fonts["Nameplates"]) or NAMEPLATE_FONT
  43.     DAMAGE_TEXT_FONT   = media:Fetch("font", db.fonts["DamageText"]) or DAMAGE_TEXT_FONT
  44.     STANDARD_TEXT_FONT = media:Fetch("font", db.fonts["StandardText"]) or STANDARD_TEXT_FONT
  45. end
  46. mod:RegisterEvent("ADDON_LOADED")
  47.  
  48. function mod:OnEnable()
  49.     if not db.enabled then
  50.         self:Disable()
  51.         return
  52.     end
  53.    
  54.     if db.override then
  55.         media:SetGlobal("font", db.font)
  56.     end
  57.    
  58.     media.RegisterCallback(mod, "LibSharedMedia_Registered")
  59.     media.RegisterCallback(mod, "LibSharedMedia_SetGlobal", "ApplyFonts")
  60.     self:LibSharedMedia_Registered()
  61.    
  62.     for k, v in pairs(_G) do
  63.         if type(v) == "table" then
  64.             local meta = getmetatable(v)
  65.             local __index = meta and meta.__index
  66.             if meta and __index and type(__index) == "table" and __index.GetFont and not (__index.IsForbidden and v:IsForbidden()) and v:GetObjectType() == "Font" then
  67.                 tinsert(fontList, v)
  68.             end
  69.         end
  70.     end
  71.     table.sort(fontList, function(a, b) return #(a:GetName()) > #(b:GetName()) end)
  72.     self:BuildFontMenus()
  73.     self:ApplyFonts()
  74.    
  75.     self.db.RegisterCallback(self, "OnProfileChanged", "ProfileChanged")
  76.     self.db.RegisterCallback(self, "OnProfileCopied", "ProfileChanged")
  77.     self.db.RegisterCallback(self, "OnProfileReset", "ProfileChanged")
  78.    
  79. end
  80.  
  81. function mod:ProfileChanged()
  82.     db = self.db.profile
  83.     if db.override then
  84.         media:SetGlobal("font", db.font)
  85.     end
  86.     self:RevertFonts()
  87.     self:ApplyFonts()
  88. end
  89.  
  90. function mod:OnDisable()
  91.     self.db.UnregisterCallback(self, "OnProfileChanged")
  92.     self.db.UnregisterCallback(self, "OnProfileCopied")
  93.     self.db.UnregisterCallback(self, "OnProfileReset")
  94.  
  95.     media.UnregisterCallback(mod, "LibSharedMedia_Registered")
  96.     media:SetGlobal("font", nil)
  97.     self:RevertFonts() 
  98. end
  99.  
  100. do
  101.     local fonts, sizes, flags, NORMAL
  102.    
  103.     local function setFont(f, key)
  104.         local n = f:GetName()
  105.         if not fontDefaults[n] then
  106.             fontDefaults[n] = {f:GetFont()}
  107.         end
  108.         key = key or n
  109.         f:SetFont(key and fonts[key] and media:Fetch("font", fonts[key]) or NORMAL, sizes[key] or fontDefaults[n][2], flags[key] or fontDefaults[n][3])
  110.     end
  111.  
  112.     function mod:ApplyFonts(fontName)
  113.         if not self:IsEnabled() then return end
  114.         fonts = db.fonts
  115.         sizes = db.sizes
  116.         flags = db.flags
  117.         NORMAL = media:Fetch("font", db.font)
  118.        
  119.         self:ADDON_LOADED()
  120.        
  121.         if fontName then
  122.             for _, f in ipairs(fontList) do
  123.                 if f:GetName():match("^" .. fontName) then
  124.                     setFont(f, fontName)
  125.                 end
  126.             end
  127.         else           
  128.             for _, f in ipairs(fontList) do
  129.                 local n = f:GetName()
  130.                 local keyMatch
  131.                 for k, v in pairs(db.fonts) do
  132.                     -- Find the shortest key matching the font
  133.                     if n:match("^" .. k) and (not keyMatch or #k < #keyMatch) then
  134.                         keyMatch = k
  135.                     end
  136.                 end
  137.                 setFont(f, keyMatch)
  138.             end
  139.         end
  140.     end
  141. end
  142.  
  143. function mod:Dump()
  144.     db.defaults = {}
  145.     db.replaced = {}
  146.    
  147.     db.defaults = fontDefaults
  148.     for _, f in ipairs(fontList) do
  149.         local n = f:GetName()
  150.         db.replaced[n] = {f:GetFont()}
  151.     end
  152. end
  153.  
  154. function mod:RevertFonts()
  155.     for k, v in pairs(fontDefaults) do
  156.         _G[k]:SetFont(unpack(v))
  157.     end
  158. end
Add Comment
Please, Sign In to add comment