mirror of
https://github.com/brues-code/pfUI.git
synced 2026-09-22 07:36:56 +00:00
0214eebf36
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.
351 lines
12 KiB
Lua
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)
|