if not WeakAuras.IsLibsOK() then return end ---@type string local AddonName = ... ---@class OptionsPrivate local OptionsPrivate = select(2, ...) local L = WeakAuras.L local pairs, next, type, unpack = pairs, next, type, unpack local Type, Version = "WeakAurasPendingUpdateButton", 6 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) local LibDD = LibStub:GetLibrary("LibUIDropDownMenu-4.0") if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end local function Hide_Tooltip() GameTooltip:Hide() end local function Show_Long_Tooltip(owner, description) GameTooltip:SetOwner(owner, "ANCHOR_NONE"); GameTooltip:SetPoint("LEFT", owner, "RIGHT"); GameTooltip:ClearLines(); local line = 1; for i,v in pairs(description) do if(type(v) == "string") then if(line > 1) then GameTooltip:AddLine(v, 1, 1, 1, 1); else GameTooltip:AddLine(v); end elseif(type(v) == "table") then if(i == 1) then GameTooltip:AddDoubleLine(v[1], v[2]..(v[3] and (" |T"..v[3]..":12:12:0:0:64:64:4:60:4:60|t") or "")); else GameTooltip:AddDoubleLine(v[1], v[2]..(v[3] and (" |T"..v[3]..":12:12:0:0:64:64:4:60:4:60|t") or ""), 1, 1, 1, 1, 1, 1, 1, 1); end end line = line + 1; end GameTooltip:Show(); end --[[----------------------------------------------------------------------------- Methods -------------------------------------------------------------------------------]] local methods = { ["OnAcquire"] = function(self) self:SetWidth(1000) self:SetHeight(32) self.hasThumbnail = false end, ["Initialize"] = function(self, id, companionData) self.callbacks = {} self.id = id self.companionData = companionData self.linkedAuras = {} self.linkedChildren = {} function self.callbacks.OnUpdateClick() local linkedAuras = {} for auraId in pairs(self.linkedAuras) do if not self.linkedChildren[auraId] then tinsert(linkedAuras, auraId) end end WeakAuras.Import(self.companionData.encoded, nil, nil, linkedAuras) end self:SetTitle(self.companionData.name) self.update:SetScript("OnClick", self.callbacks.OnUpdateClick) local data = OptionsPrivate.Private.StringToTable(self.companionData.encoded, true) WeakAuras.PreAdd(data.d) self.data = data.d self.frame:EnableKeyboard(false) self:Enable() self.frame:Hide() self.menu = {} self.frame:SetScript("OnEnter", function() self:SetNormalTooltip() Show_Long_Tooltip(self.frame, self.frame.description) end) self.frame:SetScript("OnLeave", Hide_Tooltip) end, ["SetLogo"] = function(self, path) self.frame.updateLogo.tex:SetTexture(path) end, ["SetRefreshLogo"] = function(self, path) self.frame.update:SetNormalTexture(path) end, ["Disable"] = function(self) self.background:Hide() self.frame:Disable() end, ["Enable"] = function(self) self.background:Show() self.frame:Enable() self.update:Show() self.update:Enable() self.updateLogo:Show() self:UpdateThumbnail() end, ["OnRelease"] = function(self) self:ReleaseThumbnail() self:Enable() self.title:Show() self.frame:SetScript("OnEnter", nil) self.frame:SetScript("OnLeave", nil) self.frame:SetScript("OnClick", nil) self.frame:ClearAllPoints() self.frame:Hide() self.frame = nil self.data = nil end, ["SetNormalTooltip"] = function(self) local data = self.data; local namestable = {}; local hasDescription = data.desc and data.desc ~= ""; local hasUrl = data.url and data.url ~= ""; local hasVersion = (data.semver and data.semver ~= "") or (data.version and data.version ~= ""); local hasVersionNote = self.companionData.versionNote and self.companionData.versionNote ~= "" if(hasDescription or hasUrl or hasVersion or hasVersionNote) then tinsert(namestable, " ") end if hasVersionNote then tinsert(namestable, "|cFFFFD100"..self.companionData.versionNote) tinsert(namestable, " ") end for auraId in pairs(self.linkedAuras) do if not self.linkedChildren[auraId] then tinsert(namestable, "|cFFFFD100" .. L["Linked aura: "] .. auraId .. "|r") end end tinsert(namestable, " ") if(hasDescription) then tinsert(namestable, "|cFFFFD100"..data.desc) end if (hasUrl) then tinsert(namestable, "|cFFFFD100" .. data.url .. "|r") end if (hasVersion) then tinsert(namestable, "|cFFFFD100" .. L["Version: "] .. (data.semver or data.version) .. "|r") end self:SetDescription({self.companionData.name or self.data.id, self.companionData.author or ""}, unpack(namestable)) end, ["SetDescription"] = function(self, ...) self.frame.description = {...}; end, ["SetTitle"] = function(self, title) self.titletext = title self.title:SetText(title) end, ["SetClick"] = function(self, func) self.frame:SetScript("OnClick", func) end, ["ResetLinkedAuras"] = function(self) wipe(self.linkedAuras) wipe(self.linkedChildren) end, ["MarkLinkedAura"] = function(self, auraId) self.linkedAuras[auraId] = true end, ["MarkLinkedChildren"] = function(self, auraId) self.linkedChildren[auraId] = true end, ["UpdateThumbnail"] = function(self) if not self.hasThumbnail then return end if self.data.regionType ~= self.thumbnailType then self:ReleaseThumbnail() self:AcquireThumbnail() else local option = OptionsPrivate.Private.regionOptions[self.thumbnailType] if option and option.modifyThumbnail then option.modifyThumbnail(self.frame, self.thumbnail, self.data) end end end, ["ReleaseThumbnail"] = function(self) if not self.hasThumbnail then return end self.hasThumbnail = false if self.thumbnail then local regionType = self.thumbnailType local option = OptionsPrivate.Private.regionOptions[regionType] if self.thumbnail.icon then self.thumbnail.icon:SetDesaturated(false) end option.releaseThumbnail(self.thumbnail) self.thumbnail = nil end end, ["AcquireThumbnail"] = function(self) if self.hasThumbnail then return end if not self.data then return end self.hasThumbnail = true local button = self.frame local regionType = self.data.regionType self.thumbnailType = regionType local option = OptionsPrivate.Private.regionOptions[regionType] if option and option.acquireThumbnail then self.thumbnail = option.acquireThumbnail(button, self.data) if self.thumbnail.icon then self.thumbnail.icon:SetDesaturated(true) end self:SetIcon(self.thumbnail) else self:SetIcon("Interface\\Icons\\INV_Misc_QuestionMark") end end, ["SetIcon"] = function(self, icon) self.orgIcon = icon if (type(icon) == "string" or type(icon) == "number") then self.icon:SetTexture(icon) self.icon:Show() if (self.iconRegion and self.iconRegion.Hide) then self.iconRegion:Hide() end else self.iconRegion = icon icon:SetAllPoints(self.icon) icon:SetParent(self.frame) icon:Show() self.iconRegion:Show() self.icon:Hide() end end, } --[[----------------------------------------------------------------------------- Constructor -------------------------------------------------------------------------------]] local function Constructor() local name = "WeakAurasPendingUpdateButton" .. AceGUI:GetNextWidgetNum(Type) local button = CreateFrame("Button", name, UIParent) button:SetHeight(32) button:SetWidth(1000) button.data = {} local background = button:CreateTexture(nil, "BACKGROUND") button.background = background background:SetTexture("Interface\\BUTTONS\\UI-Listbox-Highlight2.blp") background:SetBlendMode("ADD") background:SetVertexColor(0.88, 0.88, 0, 0.3) background:SetPoint("TOP", button, "TOP") background:SetPoint("BOTTOM", button, "BOTTOM") background:SetPoint("LEFT", button, "LEFT") background:SetPoint("RIGHT", button, "RIGHT") local icon = button:CreateTexture(nil, "OVERLAY") button.icon = icon icon:SetWidth(32) icon:SetHeight(32) icon:SetPoint("LEFT", button, "LEFT") local title = button:CreateFontString(nil, "OVERLAY", "GameFontNormal") button.title = title title:SetHeight(14) title:SetJustifyH("LEFT") title:SetPoint("TOPLEFT", icon, "TOPRIGHT", 2, 0) title:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT") title:SetVertexColor(0.6, 0.6, 0.6) button.description = {} local update = CreateFrame("Button", nil, button) button.update = update update.disabled = true update.func = function() end update:SetNormalTexture([[Interface\AddOns\WeakAuras\Media\Textures\wagoupdate_refresh.tga]]) update:Disable() update:SetWidth(24) update:SetHeight(24) update:SetPoint("RIGHT", button, "RIGHT", -2, 0) -- Add logo local updateLogo = CreateFrame("Frame", nil, button) button.updateLogo = updateLogo local tex = updateLogo:CreateTexture() tex:SetTexture([[Interface\AddOns\WeakAuras\Media\Textures\wagoupdate_logo.tga]]) tex:SetAllPoints() updateLogo.tex = tex updateLogo:SetSize(24, 24) updateLogo:SetPoint("CENTER", update) updateLogo:SetFrameStrata(update:GetFrameStrata()) updateLogo:SetFrameLevel(update:GetFrameLevel()-1) -- Animation On Hover local animGroup = update:CreateAnimationGroup() update.animGroup = animGroup local animRotate = animGroup:CreateAnimation("rotation") animRotate:SetDegrees(-360) animRotate:SetDuration(1) animRotate:SetSmoothing("OUT") animGroup:SetScript("OnFinished", function() if (MouseIsOver(update)) then animGroup:Play() end end) update:SetScript("OnEnter", function() animGroup:Play() end) update:Hide() updateLogo:Hide() --- @type table local widget = { frame = button, title = title, icon = icon, background = background, update = update, updateLogo = updateLogo, type = Type, } for method, func in pairs(methods) do widget[method] = func end return AceGUI:RegisterAsWidget(widget) end AceGUI:RegisterWidgetType(Type, Constructor, Version)