if not WeakAuras.IsLibsOK() then return end local widgetType, widgetVersion = "WeakAurasMiniTalent", 3 local AceGUI = LibStub and LibStub("AceGUI-3.0", true) if not AceGUI or (AceGUI:GetWidgetVersion(widgetType) or 0) >= widgetVersion then return end local L = WeakAuras.L local buttonSize = 32 local buttonSizePadded = 45 local function CreateTalentButton(parent) local button = CreateFrame("Button", nil, parent) button.obj = parent button:SetSize(buttonSize, buttonSize) local cover = button:CreateTexture(nil, "OVERLAY") cover:SetTexture("interface/buttons/checkbuttonglow") cover:SetPoint("CENTER") cover:SetSize(buttonSize + 20, buttonSize + 20) cover:SetBlendMode("ADD") cover:Hide() button.cover = cover button:SetHighlightTexture("Interface/Buttons/ButtonHilight-Square", "ADD") function button:Yellow() self.cover:Show() self.cover:SetVertexColor(1, 1, 0, 1) local normalTexture = self:GetNormalTexture() if normalTexture then normalTexture:SetVertexColor(1, 1, 1, 1) end if self.line1 then self.line1:Hide() self.line2:Hide() end end function button:Red() self.cover:Show() self.cover:SetVertexColor(1, 0, 0, 1) local normalTexture = self:GetNormalTexture() if normalTexture then normalTexture:SetVertexColor(1, 0, 0, 1) end if not self.line1 then local line1 = button:CreateLine() line1:SetColorTexture(1, 0, 0, 1) line1:SetStartPoint("TOPLEFT", 3, -3) line1:SetEndPoint("BOTTOMRIGHT", -3, 3) line1:SetBlendMode("ADD") line1:SetThickness(2) local line2 = button:CreateLine() line2:SetColorTexture(1, 0, 0, 1) line2:SetStartPoint("TOPRIGHT", -3, -3) line2:SetEndPoint("BOTTOMLEFT", 3, 3) line2:SetBlendMode("ADD") line2:SetThickness(2) self.line1 = line1 self.line2 = line2 end self.line1:Show() self.line2:Show() end function button:Clear() self.cover:Hide() local normalTexture = self:GetNormalTexture() if normalTexture then normalTexture:SetVertexColor(0.3, 0.3, 0.3, 1) end if self.line1 then self.line1:Hide() self.line2:Hide() end end function button:UpdateTexture() if self.state == nil then self:Clear() elseif self.state == true then self:Yellow() elseif self.state == false then self:Red() end end function button:SetValue(value) self.state = value self:UpdateTexture() end button:SetScript("OnClick", function(self) if self.state == true then self:SetValue(false) elseif self.state == false then self:SetValue(nil) else self:SetValue(true) end self.obj.obj:Fire("OnValueChanged", self.index, self.state) end) button:SetScript("OnEnter", function(self) GameTooltip:SetOwner(self, "ANCHOR_RIGHT") GameTooltip:SetTalent(self.tab, self.index - (self.tab - 1) * MAX_NUM_TALENTS, false, false, false, false) end) button:Clear() return button end local function Button_ShowToolTip(self) if self.spellId then GameTooltip:SetOwner(self, "ANCHOR_RIGHT") GameTooltip:SetSpellByID(self.spellId) end end local function Button_HideToolTip(self) GameTooltip:Hide() end local function TalentFrame_Update(self) local buttonShownCount = 0 if self.list then for _, button in ipairs(self.buttons) do local data = self.list[button.index] if not data then button:Hide() else local icon, tier, column, spellId = unpack(data) if spellId == nil then local talentId = button.index - (button.tab - 1) * MAX_NUM_TALENTS local name = GetTalentInfo(button.tab, talentId) print("Please report on WeakAuras Discord:\nspell missing", button.tab, tier, column, name) end button.tier = tier button.column = column button:SetNormalTexture(icon) button.spellId = spellId button:UpdateTexture() button:ClearAllPoints() button:SetScript("OnEnter", Button_ShowToolTip) button:SetScript("OnLeave", Button_HideToolTip) button:SetMotionScriptsWhileDisabled(true) if self.open then button:SetPoint("TOPLEFT", button.obj, "TOPLEFT", buttonSizePadded * (column - 1) + (button.tab - 1) * buttonSizePadded * 4 + 5, -buttonSizePadded * (tier - 1) - 5) button:SetEnabled(true) button:SetMouseClickEnabled(true) button:Show() else if button.state ~= nil then buttonShownCount = buttonShownCount + 1 button:SetPoint( "TOPLEFT", button.obj, "TOPLEFT", 7 + ((buttonShownCount - 1) % 11) * (buttonSizePadded + 4), -7 + -1 * (ceil(buttonShownCount / 11) - 1) * (buttonSizePadded + 4) ) button:SetEnabled(false) button:SetMouseClickEnabled(false) button:Show() else button:Hide() end end end end end if self.open then self.frame:SetHeight(self.saveSize.fullHeight) else local rows = ceil(buttonShownCount / 11) if rows > 0 then self.frame:SetHeight(self.saveSize.collapsedRowHeight * rows) else self.frame:SetHeight(1) end end if self.list then local backgroundIndex = MAX_NUM_TALENTS * GetNumTalentTabs() + 1 for tab = 1, GetNumTalentTabs() do local background = self.backgrounds[tab] local texture = self.list[backgroundIndex][tab] local base = "Interface\\TalentFrame\\" .. texture .. "-" background:SetTexture(base .. "TopLeft") if self.open then background:Show() else background:Hide() end end end end local methods = { OnAcquire = function(self) self:SetDisabled(false) end, OnRelease = function(self) self:SetDisabled(true) self:SetMultiselect(false) self.value = nil self.list = nil end, SetList = function(self, list) self.list = list or {} TalentFrame_Update(self) end, SetDisabled = function(self, disabled) if disabled then for _, button in pairs(self.buttons) do button:Hide() end for _, background in pairs(self.backgrounds) do background:Hide() end self.open = nil self.toggle.frame:Hide() self.frame:Hide() else self.open = nil TalentFrame_Update(self) self.toggle.frame:Show() self.frame:Show() end end, SetItemValue = function(self, item, value) if self.buttons[item] then self.buttons[item]:SetValue(value) TalentFrame_Update(self) end end, SetValue = function(self, value) end, SetLabel = function(self, text) end, SetMultiselect = function(self, multi) end, ToggleView = function(self) if not self.open then self.open = true else self.open = nil end TalentFrame_Update(self) self.parent:DoLayout() end, } local function Constructor() local name = widgetType .. AceGUI:GetNextWidgetNum(widgetType) local talentFrame = CreateFrame("Button", name, UIParent) talentFrame:SetFrameStrata("FULLSCREEN_DIALOG") local buttons = {} for i = 1, MAX_NUM_TALENTS * GetNumTalentTabs() do local button = CreateTalentButton(talentFrame) button.index = i button.tab = ceil(i / MAX_NUM_TALENTS) table.insert(buttons, button) end local backgrounds = {} for tab = 1, GetNumTalentTabs() do local background = talentFrame:CreateTexture(nil, "BACKGROUND") background:SetPoint("TOPLEFT", talentFrame, "TOPLEFT", (tab - 1) * buttonSizePadded * 4, 0) background:SetPoint("BOTTOMRIGHT", talentFrame, "BOTTOMLEFT", tab * buttonSizePadded * 4, 0) background:SetTexCoord(0, 1, 0, 1) background:Show() table.insert(backgrounds, background) end -- rescale buttons and resize frame to fit in weakauras options local width = buttonSizePadded * 4 * 3 + 10 local height = buttonSizePadded * 11 + 10 local finalWidth = 440 local scale = (finalWidth / width) local finalHeight = height * scale for _, button in ipairs(buttons) do button:SetScale(scale) end for _, background in ipairs(backgrounds) do background:SetScale(scale) end talentFrame:SetSize(finalWidth, finalHeight) talentFrame:SetScript("OnClick", function(self) self.obj:ToggleView() end) local toggle = AceGUI:Create("WeakAurasToolbarButton") toggle:SetText(L["Select Talent"]) toggle:SetTexture("interface/buttons/ui-microbutton-talents-up") toggle.icon:ClearAllPoints() toggle.icon:SetPoint("LEFT", toggle.frame, "LEFT", 0, 10) toggle.icon:SetSize(28, 58) toggle.icon:SetScale(0.6) toggle.frame:SetPoint("BOTTOMRIGHT", talentFrame, "TOPRIGHT", 0, 2) toggle.frame:SetParent(talentFrame) toggle.frame.obj.text:SetVertexColor(1, 1, 1, 1) toggle.frame:Show() toggle:SetCallback("OnClick", function(self) local parent = self.frame:GetParent() parent.obj:ToggleView() end) local widget = { frame = talentFrame, type = widgetType, buttons = buttons, toggle = toggle, backgrounds = backgrounds, saveSize = { fullWidth = finalWidth, fullHeight = finalHeight, collapsedRowHeight = (buttonSizePadded + 5) * scale, }, } for method, func in pairs(methods) do widget[method] = func end talentFrame.obj = widget return AceGUI:RegisterAsWidget(widget) end AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)