diff --git a/modules/addons.lua b/modules/addons.lua new file mode 100644 index 0000000..220035c --- /dev/null +++ b/modules/addons.lua @@ -0,0 +1,350 @@ +pfUI:RegisterModule("addons", "vanilla:tbc", function () + local rawborder, border = GetBorderSize() + + -- add main menu button + local pfUIAddonButton = CreateFrame("Button", "GameMenuButtonPFUIAddOns", GameMenuFrame, "GameMenuButtonTemplate") + pfUIAddonButton:SetPoint("TOP", 0, -32) + pfUIAddonButton:SetText(T["AddOns"]) + pfUIAddonButton:SetScript("OnClick", function() + pfUI.addons:Show() + HideUIPanel(GameMenuFrame) + end) + SkinButton(pfUIAddonButton) + + local point, relativeTo, relativePoint, xOffset, yOffset = GameMenuButtonOptions:GetPoint() + GameMenuButtonOptions:SetPoint(point, relativeTo, relativePoint, xOffset, yOffset - 22) + GameMenuFrame:SetHeight(GameMenuFrame:GetHeight()+22) + + -- addon window + pfUI.addons = CreateFrame("Frame", "pfAddons", UIParent) + pfUI.addons:SetFrameStrata("DIALOG") + pfUI.addons:SetHeight(490) + pfUI.addons:SetWidth(380) + pfUI.addons:SetPoint("CENTER", 0,0) + pfUI.addons:EnableMouseWheel(1) + pfUI.addons:SetMovable(true) + pfUI.addons:EnableMouse(true) + pfUI.addons:RegisterForDrag("LeftButton") + pfUI.addons:SetScript("OnDragStart", function() this:StartMoving() end) + pfUI.addons:SetScript("OnDragStop", function() this:StopMovingOrSizing() end) + pfUI.addons:Hide() + + CreateBackdrop(pfUI.addons, nil, true, .75) + CreateBackdropShadow(pfUI.addons) + + pfUI.addons:SetScript("OnHide", function() + if this.hasChanged then + pfUI.gui:Reload() + this.hasChanged = nil + end + end) + + tinsert(UISpecialFrames,"pfAddons") + + pfUI.addons.caption = pfUI.addons:CreateFontString("Status", "LOW", "GameFontNormal") + pfUI.addons.caption:SetFont(pfUI.font_default, C.global.font_size + 4, "OUTLINE") + pfUI.addons.caption:SetTextColor(.2, 1, .8, 1) + pfUI.addons.caption:SetPoint("TOP", 0, -10) + pfUI.addons.caption:SetJustifyH("LEFT") + pfUI.addons.caption:SetText(T["Addon List"]) + + pfUI.addons.close = CreateFrame("Button", "pfBagClose", pfUI.addons) + pfUI.addons.close:SetPoint("TOPRIGHT", -border*2,-border*2 ) + CreateBackdrop(pfUI.addons.close) + pfUI.addons.close:SetHeight(15) + pfUI.addons.close:SetWidth(15) + pfUI.addons.close.texture = pfUI.addons.close:CreateTexture("pfBagClose") + pfUI.addons.close.texture:SetTexture(pfUI.media["img:close"]) + pfUI.addons.close.texture:ClearAllPoints() + pfUI.addons.close.texture:SetPoint("TOPLEFT", pfUI.addons.close, "TOPLEFT", 4, -4) + pfUI.addons.close.texture:SetPoint("BOTTOMRIGHT", pfUI.addons.close, "BOTTOMRIGHT", -4, 4) + pfUI.addons.close.texture:SetVertexColor(1,.25,.25,1) + pfUI.addons.close:SetScript("OnEnter", function () + CreateBackdrop(pfUI.addons.close) + pfUI.addons.close.backdrop:SetBackdropBorderColor(1,.25,.25,1) + end) + + pfUI.addons.close:SetScript("OnLeave", function () + CreateBackdrop(pfUI.addons.close) + end) + + pfUI.addons.close:SetScript("OnClick", function() + pfUI.addons:Hide() + end) + + -- addons profile + local function GetSelectedAddonsList() + local selected_addons = {} + for i, frame in ipairs(pfUI.addons.list) do + if frame.input:GetChecked() then + table.insert(selected_addons, frame.aname) + end + end + return selected_addons + end + + local function SetAddonProfile(profile) + -- create new profile if not existing + if not pfUI_addon_profiles[profile] then + pfUI_addon_profiles[profile] = GetSelectedAddonsList() + end + + -- set dropdown to profile + pfUI.addons.profile.dropdown:SetSelectionByText(profile) + + -- load profile + local selected_list = pfUI_addon_profiles[profile] + for i=1, GetNumAddOns() do + local active = false + local f = pfUI.addons.list[i] + + for i_i, n in ipairs(selected_list) do + if f.aname == n then + active = true + break + end + end + + if active then + if not f.input:GetChecked() then + f.input:Click() + end + else + if f.input:GetChecked() then + f.input:Click() + end + end + end + end + + -- addon profiles + pfUI.addons.profile = CreateFrame("Frame", "pfAddonListProfile", pfUI.addons) + pfUI.addons.profile:SetScript("OnShow", function() + pfUI_addon_profiles[T["Current"]] = GetSelectedAddonsList() + SetAddonProfile(T["Current"]) + end) + + pfUI.addons.profile:SetPoint("TOP", pfUI.addons, "TOP", 0, -30) + pfUI.addons.profile:SetHeight(30) + pfUI.addons.profile:SetWidth(370) + CreateBackdrop(pfUI.addons.profile, nil, true) + + -- addon profile: title + pfUI.addons.profile.caption = pfUI.addons.profile:CreateFontString("Status", "LOW", "GameFontNormal") + pfUI.addons.profile.caption:SetFontObject(GameFontWhite) + pfUI.addons.profile.caption:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE") + pfUI.addons.profile.caption:SetPoint("LEFT", 10, 0) + pfUI.addons.profile.caption:SetText(T["Addon Profile"]) + + -- addon profile: delete + pfUI.addons.profile.del = CreateFrame("Button", nil, pfUI.addons.profile, "UIPanelButtonTemplate") + SkinButton(pfUI.addons.profile.del) + pfUI.addons.profile.del:SetWidth(16) + pfUI.addons.profile.del:SetHeight(16) + pfUI.addons.profile.del:SetPoint("RIGHT", -10, 0) + pfUI.addons.profile.del:GetFontString():SetPoint("CENTER", 1, 0) + pfUI.addons.profile.del:SetText("-") + pfUI.addons.profile.del:SetTextColor(1,.5,.5,1) + pfUI.addons.profile.del:SetScript("OnClick", function() -- TODO + local id, name = pfUI.addons.profile.dropdown:GetSelection() + if not name then return end + CreateQuestionDialog(T["Delete profile"] .. " '|cff33ffcc" .. name .. "|r'?", function() + pfUI_addon_profiles[name] = nil + SetAddonProfile(T["Current"]) + end) + end) + + -- addon profile: create + pfUI.addons.profile.add = CreateFrame("Button", nil, pfUI.addons.profile, "UIPanelButtonTemplate") + SkinButton(pfUI.addons.profile.add) + pfUI.addons.profile.add:SetWidth(16) + pfUI.addons.profile.add:SetHeight(16) + pfUI.addons.profile.add:SetPoint("RIGHT", pfUI.addons.profile.del, "LEFT", -4, 0) + pfUI.addons.profile.add:GetFontString():SetPoint("CENTER", 1, 0) + pfUI.addons.profile.add:SetText("+") + pfUI.addons.profile.add:SetTextColor(.5,1,.5,1) + pfUI.addons.profile.add:SetScript("OnClick", function() + CreateQuestionDialog(T["Please enter a name for the new profile."], + function() + local profile_name = this:GetParent().input:GetText() + local bad = string.gsub(profile_name,"([%w%s]+)","") + if bad ~= "" then + message("\"" .. bad .. "\" " .. T["is not allowed in profile name"]) + else + SetAddonProfile(profile_name) + end + end, false, true) + end) + + -- addon profile: dropdown + pfUI.addons.profile.dropdown = CreateDropDownButton("pfAddonListProfileList", pfUI.addons.profile) + pfUI.addons.profile.dropdown:SetBackdrop(nil) + pfUI.addons.profile.dropdown:ClearAllPoints() + pfUI.addons.profile.dropdown:SetPoint("RIGHT", pfUI.addons.profile.add, "LEFT", -2, 0) + pfUI.addons.profile.dropdown:SetWidth(220) + pfUI.addons.profile.dropdown:SetMenu(function() + local menu = {} + + for name, list in pairs(pfUI_addon_profiles) do + local name = name + local entry = {} + entry.text = name + entry.checked = false + entry.func = function() + SetAddonProfile(name) + end + table.insert(menu, entry) + end + + return menu + end) + + -- addon list: scroll frame + pfUI.addons.scroll = CreateScrollFrame("pfAddonListScroll", pfUI.addons) + pfUI.addons.scroll:SetWidth(360) + pfUI.addons.scroll:SetHeight(410) + pfUI.addons.scroll:SetPoint("BOTTOM", 0, 10) + + pfUI.addons.scroll.backdrop = CreateFrame("Frame", nil, pfUI.addons.scroll) + pfUI.addons.scroll.backdrop:SetFrameLevel(1) + pfUI.addons.scroll.backdrop:SetPoint("TOPLEFT", pfUI.addons.scroll, "TOPLEFT", -5, 5) + pfUI.addons.scroll.backdrop:SetPoint("BOTTOMRIGHT", pfUI.addons.scroll, "BOTTOMRIGHT", 5, -5) + CreateBackdrop(pfUI.addons.scroll.backdrop, nil, true) + + -- addon list: scroll parent + pfUI.addons.list = CreateScrollChild("pfAddonList", pfUI.addons.scroll) + pfUI.addons.list:RegisterEvent("ADDON_LOADED") + pfUI.addons.list:RegisterEvent("PLAYER_ENTERING_WORLD") + pfUI.addons.list:SetHeight(GetNumAddOns() * 25 + 26) + + local function AddonOnEnter() + this:SetBackdropBorderColor(1,1,1,.08) + + GameTooltip:SetOwner(this, "ANCHOR_RIGHT") + GameTooltip:SetText(this.atitle) + if this.aversion then + GameTooltip:AddDoubleLine(T["Version"], this.aversion, 1,1,1, .2,1,.8) + end + + if this.aauthor then + GameTooltip:AddDoubleLine(T["Author"], this.aauthor, 1,1,1, .2,1,.8) + end + + GameTooltip:AddLine(this.anote, .75,.75,.75,1) + GameTooltip:SetWidth(180) + GameTooltip:Show() + end + + local function AddonOnLeave() + this:SetBackdropBorderColor(1,1,1,.04) + GameTooltip:Hide() + end + + local function AddonOnClick() + this.input:Click() + end + + local function InputOnClick() + if this:GetChecked() then + EnableAddOn(this:GetID()) + else + DisableAddOn(this:GetID()) + end + pfUI.addons.hasChanged = true + + local id, name = pfUI.addons.profile.dropdown:GetSelection() + name = name or T["Current"] + pfUI_addon_profiles[name] = GetSelectedAddonsList() + end + + pfUI.addons.list:SetScript("OnEvent", function() + for i=1, GetNumAddOns() do + local aname, atitle, anote = GetAddOnInfo(i) + local aauthor = GetAddOnMetadata(aname, "Author") + local aversion = GetAddOnMetadata(aname, "Version") + + -- basic frame + if not pfUI.addons.list[i] then + pfUI.addons.list[i] = CreateFrame("Button", nil, pfUI.addons.list) + local frame = pfUI.addons.list[i] + frame.aname = aname + frame.atitle = atitle + frame.anote = anote + frame.aauthor = aauthor + frame.aversion = aversion + + frame:SetWidth(340) + frame:SetHeight(25) + frame:SetPoint("TOPLEFT", 5, i * -25 + 20) + + frame:SetBackdrop(pfUI.backdrop_hover) + frame:SetBackdropBorderColor(1,1,1,.04) + + frame:EnableMouse(1) + frame:SetScript("OnEnter", AddonOnEnter) + frame:SetScript("OnLeave", AddonOnLeave) + frame:SetScript("OnClick", AddonOnClick) + + -- caption + frame.caption = frame:CreateFontString("Status", "LOW", "GameFontNormal") + frame.caption:SetFont(pfUI.font_default, C.global.font_size + 2, "OUTLINE") + frame.caption:SetPoint("LEFT", frame, "LEFT", 2, 0) + frame.caption:SetFontObject(GameFontWhite) + frame.caption:SetJustifyH("LEFT") + frame.caption:SetText(atitle) + + -- input field + frame.input = CreateFrame("CheckButton", nil, frame, "UICheckButtonTemplate") + frame.input:SetFrameLevel(3) + frame.input:SetNormalTexture("") + frame.input:SetPushedTexture("") + frame.input:SetHighlightTexture("") + CreateBackdrop(frame.input, nil, true) + frame.input:SetBackdropBorderColor(.3,.3,.3,1) + frame.input:SetWidth(14) + frame.input:SetHeight(14) + frame.input:SetPoint("RIGHT" , -5, 1) + frame.input:SetID(i) + frame.input:SetScript("OnClick", InputOnClick) + end + + if IsAddOnLoaded(i) then + pfUI.addons.list[i].input:SetChecked() + pfUI.addons.list[i].caption:SetAlpha(1) + else + pfUI.addons.list[i].caption:SetAlpha(.5) + end + end + end) + + -- show only frames in visible range + function pfUI.addons.scroll:ShowVisibleRange() + local top_index, bottom_index, range + range = floor(pfUI.addons.scroll:GetHeight() / 25) + 1 + top_index = floor(pfUI.addons.scroll:GetVerticalScroll() / 25) > 0 and floor(pfUI.addons.scroll:GetVerticalScroll() / 25) or 1 + bottom_index = top_index + range + for i=1, GetNumAddOns() do + if i >= top_index and i <= bottom_index then + pfUI.addons.list[i]:Show() + else + pfUI.addons.list[i]:Hide() + end + end + end + + pfUI.addons.scroll.slider:SetScript("OnValueChanged", function() + this:GetParent():SetVerticalScroll(this:GetValue()) + end) + pfUI.addons.scroll:SetScript("OnScrollRangeChanged", function() + this.slider:SetMinMaxValues(1, floor(this:GetVerticalScrollRange() + 25)) + end) + pfUI.addons.scroll:SetScript("OnShow", function() + this.slider:SetValue(floor(this:GetVerticalScroll())) + pfUI.addons.scroll:ShowVisibleRange() + end) + pfUI.addons.scroll:SetScript("OnVerticalScroll", function() + pfUI.addons.scroll:ShowVisibleRange() + this.slider:SetValue(floor(this:GetVerticalScroll())) + end) + +end)