local PA, ACL, ACH = unpack(_G.ProjectAzilroka) local BLDB = PA:NewModule('BrokerLDB', 'AceEvent-3.0') PA.BLDB, _G.BrokerLDB = BLDB, BLDB local _G = _G local next, tinsert, tremove = next, tinsert, tremove local strfind, strlower, strlen = strfind, strlower, strlen local CreateFrame = CreateFrame local GameTooltip = GameTooltip local UIParent = UIParent BLDB.Title, BLDB.Description, BLDB.Authors, BLDB.isEnabled = ACL['|cFF16C3F2Broker|r|cFFFFFFFFLDB|r'], ACL['Provides a Custom DataBroker Bar'], 'Azilroka', false function BLDB:TextUpdate(_, name, _, value) local naText = strfind(strlower(value or ''), 'n/a', nil, true) if not value or (strlen(value) >= 3) or (value == name) or naText then BLDB.PluginObjects[name]:SetText((not naText and value) or name) else BLDB.PluginObjects[name]:SetFormattedText('%s: %s', name, value) end end function BLDB:AnimateSlide(frame, x, y, duration) frame.anim = frame:CreateAnimationGroup('Move_In') frame.anim.in1 = frame.anim:CreateAnimation('Translation') frame.anim.in1:SetDuration(0) frame.anim.in1:SetOrder(1) frame.anim.in2 = frame.anim:CreateAnimation('Translation') frame.anim.in2:SetDuration(duration) frame.anim.in2:SetOrder(2) frame.anim.in2:SetSmoothing('OUT') frame.anim.out1 = frame:CreateAnimationGroup('Move_Out') frame.anim.out2 = frame.anim.out1:CreateAnimation('Translation') frame.anim.out2:SetDuration(duration) frame.anim.out2:SetOrder(1) frame.anim.out2:SetSmoothing('IN') frame.anim.in1:SetOffset(x, y) frame.anim.in2:SetOffset(-x, -y) frame.anim.out2:SetOffset(x, y) frame.anim.out1:SetScript('OnFinished', function() frame:Hide() end) end function BLDB:AnimSlideIn(frame) frame.anim.out1:Stop() frame:Show() frame.anim:Play() end function BLDB:AnimSlideOut(frame) frame.anim:Finish() frame.anim:Stop() frame.anim.out1:Play() end function BLDB:SlideOut() for _, Slides in next, BLDB.Whitelist do BLDB:AnimSlideIn(Slides) end BLDB:AnimSlideIn(BLDB.Frame) BLDB.Frame.Arrow:SetRotation(1.57) BLDB.Slide = 'Out' end function BLDB:SlideIn() for _, Slides in next, BLDB.Buttons do Slides:Hide() end BLDB.Frame.Arrow:SetRotation(-1.57) BLDB.Slide = 'In' end function BLDB:Update() for Name, Object in PA.LDB:DataObjectIterator() do BLDB:New(nil, Name, Object) end for Key, Slide in next, BLDB.Buttons do Slide.Text:SetFont(PA.Libs.LSM:Fetch('font', BLDB.db['Font']), BLDB.db['FontSize'], BLDB.db['FontFlag']) if BLDB.db['ShowIcon'] and BLDB.db['ShowText'] then if BLDB.db['PanelWidth'] == 0 then BLDB.db['PanelWidth'] = 140 end Slide:SetSize(BLDB.db['PanelWidth'] + BLDB.db['PanelHeight'], BLDB.db['PanelHeight']) Slide.Icon:Show() Slide.Icon:SetPoint('RIGHT', Slide, 'RIGHT', -2, 0) Slide.Icon:Size(BLDB.db['PanelHeight'] - 4) Slide.Text:Show() Slide.Text:SetPoint('CENTER', -(BLDB.db['PanelHeight'] / 2), 0) elseif BLDB.db['ShowIcon'] then BLDB.db['PanelWidth'] = 0 Slide:SetSize(BLDB.db['PanelHeight'], BLDB.db['PanelHeight']) Slide.Icon:Show() Slide.Icon:Size(BLDB.db['PanelHeight']) Slide.Icon:SetPoint('RIGHT', Slide, 'RIGHT', 0, 0) Slide.Text:Hide() elseif BLDB.db['ShowText'] then if BLDB.db['PanelWidth'] == 0 then BLDB.db['PanelWidth'] = 140 end Slide:SetSize(BLDB.db['PanelWidth'], BLDB.db['PanelHeight']) Slide.Icon:Hide() Slide.Text:Show() Slide.Text:SetPoint('CENTER', 0, 0) end if Slide.anim then local x = BLDB.db["PanelWidth"] + BLDB.db["PanelHeight"] Slide.anim.in1:SetOffset(-x, 0) Slide.anim.in2:SetOffset(x, 0) Slide.anim.out2:SetOffset(-x, 0) end for _, Blacklisted in next, BLDB.Blacklist do if Slide:GetName() == Blacklisted then tremove(BLDB.Whitelist, Key) Slide.Enabled = false return end end end local yOffSet = 0 for _, Slide in next, BLDB.Whitelist do Slide:SetPoint('TOPLEFT', BLDB.Frame, 'TOPRIGHT', 1, yOffSet) yOffSet = yOffSet - BLDB.db['PanelHeight'] - 1 end BLDB.Frame:Height((BLDB.db['PanelHeight'] * #BLDB.Whitelist) + (#BLDB.Whitelist - 1)) if (#BLDB.Buttons == 0 or #BLDB.Whitelist == 0) then BLDB.Frame:Hide() end if not BLDB.db['MouseOver'] then _G.UIFrameFadeIn(BLDB.Frame, 0.2, BLDB.Frame:GetAlpha(), 1) else _G.UIFrameFadeOut(BLDB.Frame, 0.2, BLDB.Frame:GetAlpha(), 0) end end function BLDB:AddBlacklistFrame(frame) frame.Enabled = false local index for i, v in next, BLDB.Whitelist do if v == frame:GetName() then index = i break end end tremove(BLDB.Whitelist, index) tinsert(BLDB.Blacklist, frame:GetName()) BLDB:SlideIn() BLDB:Update() end function BLDB:RemoveBlacklistFrame(frame) frame.Enabled = true local index for i, v in next, BLDB.Blacklist do if v == frame:GetName() then index = i break end end tremove(BLDB.Blacklist, index) tinsert(BLDB.Whitelist, frame) BLDB:SlideIn() BLDB:Update() end function BLDB:New(_, name, object) if _G['BLDB_'..name] then return end for _, v in next, BLDB.Ignore do if name == v then return end end local button = CreateFrame('Button', 'BLDB_'..name, BLDB.Frame) button:Hide() button.pluginName = name button.pluginObject = object button:SetFrameStrata('BACKGROUND') button:SetFrameLevel(3) PA:SetTemplate(button, 'Transparent') BLDB:AnimateSlide(button, -150, 0, 1) button:SetHeight(BLDB.db['PanelHeight']) button:SetWidth(BLDB.db['PanelWidth']) button.Enabled = true tinsert(BLDB.Buttons, button) tinsert(BLDB.Whitelist, button) button.Text = button:CreateFontString(nil, 'OVERLAY') button.Text:SetFont(PA.Libs.LSM:Fetch('font', BLDB.db['Font']), BLDB.db['FontSize'], BLDB.db['FontFlag']) button.Text:SetPoint('CENTER', button) button.Icon = button:CreateTexture(nil, 'ARTWORK') button.Icon:SetTexCoord(0.08, 0.92, 0.08, 0.92) PA:CreateBackdrop(button.Icon) BLDB.PluginObjects[name] = button PA.LDB.RegisterCallback(BLDB, 'LibDataBroker_AttributeChanged_'..name, 'TextUpdate') button:SetScript('OnEnter', function(s) if s.anim:IsPlaying() then return end if s.pluginObject.OnTooltipShow then GameTooltip:SetOwner(s, 'ANCHOR_RIGHT' , 2, -(BLDB.db['PanelHeight'])) GameTooltip:ClearLines() s.pluginObject.OnTooltipShow(GameTooltip, s) GameTooltip:Show() elseif s.pluginObject.OnEnter then s.pluginObject.OnEnter(s) end end) button:SetScript('OnLeave', function(s) GameTooltip:Hide() if s.pluginObject.OnLeave then s.pluginObject.OnLeave(s) end end) button:SetScript('OnClick', function(s, btn) if s.anim:IsPlaying() then return end if s.pluginObject.OnClick then s.pluginObject.OnClick(s, btn) end end) button:SetScript('OnUpdate', function(s) s.Icon:SetTexture(object.icon) end) tinsert(BLDB.EasyMenu, { text = 'Show '..name, checked = function() return button.Enabled end, func = function() if button.Enabled then BLDB:AddBlacklistFrame(button) else BLDB:RemoveBlacklistFrame(button) end BLDB:Update() end } ) if object.OnCreate then object.OnCreate(object, button) end end function BLDB:GetOptions() local BrokerLDB = ACH:Group(BLDB.Title, BLDB.Description, nil, nil, function(info) return BLDB.db[info[#info]] end) PA.Options.args.BrokerLDB = BrokerLDB BrokerLDB.args.Description = ACH:Description(BLDB.Description, 0) BrokerLDB.args.Enable = ACH:Toggle(ACL['Enable'], nil, 1, nil, nil, nil, nil, function(info, value) BLDB.db[info[#info]] = value if not BLDB.isEnabled then BLDB:Initialize() else _G.StaticPopup_Show('PROJECTAZILROKA_RL') end end) BrokerLDB.args.General = ACH:Group(ACL['General'], nil, 2, nil, nil, function(info, value) BLDB.db[info[#info]] = value BLDB:Update() end) BrokerLDB.args.General.inline = true BrokerLDB.args.General.args.ShowIcon = ACH:Toggle(ACL['Show Icon'], nil, 1) BrokerLDB.args.General.args.MouseOver = ACH:Toggle(ACL['MouseOver'], nil, 2) BrokerLDB.args.General.args.ShowText = ACH:Toggle(ACL['Show Text'], nil, 3) BrokerLDB.args.General.args.PanelHeight = ACH:Range(ACL['Panel Height'], nil, 4, { min = 20, max = 40, step = 1 }) BrokerLDB.args.General.args.PanelWidth = ACH:Range(ACL['Panel Width'], nil, 5, { min = 0, softMin = 140, max = 280, step = 1 }) BrokerLDB.args.General.args.FontSettings = ACH:Group(ACL['Font Settings'], nil, -1) BrokerLDB.args.General.args.FontSettings.inline = true BrokerLDB.args.General.args.FontSettings.args.Font = ACH:SharedMediaFont(ACL['Font'], nil, 1) BrokerLDB.args.General.args.FontSettings.args.FontSize = ACH:Range(ACL['Font Size'], nil, 2, { min = 6, max = 22, step = 1 }) BrokerLDB.args.General.args.FontSettings.args.FontFlag = ACH:FontFlags(ACL['Font Outline'], nil, 3) BrokerLDB.args.AuthorHeader = ACH:Header(ACL['Authors:'], -2) BrokerLDB.args.Authors = ACH:Description(BLDB.Authors, -1, 'large') end function BLDB:BuildProfile() PA.Defaults.profile.BrokerLDB = { Enable = false, PanelHeight = 20, PanelWidth = 140, MouseOver = false, ShowIcon = false, ShowText = true, Font = 'Tukui Pixel', FontSize = 12, FontFlag = 'MONOCHROMEOUTLINE', } end function BLDB:UpdateSettings() BLDB.db = PA.db.BrokerLDB end function BLDB:Initialize() if BLDB.db.Enable ~= true then return end BLDB.isEnabled = true BLDB.DropDown = CreateFrame('Frame', 'BLDBDropDown', UIParent, 'UIDropDownMenuTemplate') BLDB.Slide = 'In' BLDB.EasyMenu = {} BLDB.Buttons = {} BLDB.PluginObjects = {} BLDB.Ignore = { 'Cork' } BLDB.Whitelist = {} BLDB.Blacklist = {} PA.LDB.RegisterCallback(BLDB, 'LibDataBroker_DataObjectCreated', 'New') local Frame = CreateFrame('Button', nil, UIParent) Frame.Arrow = Frame:CreateTexture(nil, 'OVERLAY') Frame.Arrow:SetTexture([[Interface\AddOns\ProjectAzilroka\Media\Textures\Arrow]]) Frame.Arrow:SetSize(12, 12) Frame.Arrow:SetPoint('CENTER', Frame, 0, 0) Frame:SetFrameStrata('BACKGROUND') Frame:SetWidth(15) Frame:SetPoint('LEFT', UIParent, 'LEFT', 1, 0) Frame:RegisterForClicks('LeftButtonDown', 'RightButtonDown') PA:SetTemplate(Frame, 'Transparent') BLDB:AnimateSlide(Frame, -150, 0, 1) Frame:SetScript('OnEnter', function(s) _G.UIFrameFadeIn(s, 0.2, s:GetAlpha(), 1) end) Frame:SetScript('OnLeave', function(s) if BLDB.Slide == 'In' and BLDB.db['MouseOver'] then _G.UIFrameFadeOut(s, 0.2, s:GetAlpha(), 0) end end) Frame:SetScript('OnClick', function(s, btn) if s.anim:IsPlaying() then return end if btn == 'LeftButton' then if BLDB.Slide == 'In' then BLDB:SlideOut() else BLDB:SlideIn() end else _G.EasyMenu(BLDB.EasyMenu, BLDB.DropDown, 'cursor', 0, 0, 'MENU', 2) end end) BLDB.Frame = Frame BLDB:Update() BLDB:SlideIn() end