Files
pfUI/modules/addons.lua
T
shagu 0214eebf36 core: switch from mousedown to drag functions
Due to crashes/freezes while moving some frames, one possible
reason could be that pfUI was using OnMouseDown and OnMouseUp
to run its frame-moving code. I have noticed better performance
when using the intended functions, OnDragStart and OnDragStop
to move frames.

This commit changes every occurrence of such functions and splits
drag and click into seperate functions where required.
2022-05-07 21:35:52 +02:00

351 lines
12 KiB
Lua

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)